diff --git a/.gitignore b/.gitignore index eac3285a..565a1a26 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,7 @@ dist/ # external CUE dependencies /*/cue.mod/pkg/ + +# ignore shared package links +.plugins-shared-link-bk.json +.plugins-shared-link-lock-bk.json diff --git a/logstable/cue.mod/module.cue b/logstable/cue.mod/module.cue index f293e8b1..94a141e4 100644 --- a/logstable/cue.mod/module.cue +++ b/logstable/cue.mod/module.cue @@ -5,3 +5,9 @@ language: { source: { kind: "git" } +deps: { + "github.com/perses/shared/cue@v0": { + v: "v0.53.0-rc.1" + default: true + } +} diff --git a/logstable/schemas/logstable.cue b/logstable/schemas/logstable.cue index c9460147..b683fc1e 100644 --- a/logstable/schemas/logstable.cue +++ b/logstable/schemas/logstable.cue @@ -13,9 +13,15 @@ package model +import ( + "github.com/perses/shared/cue/common" +) + kind: "LogsTable" spec: close({ allowWrap?: bool enableDetails?: bool showTime?: bool + selection?: common.#selection + actions?: common.#actions }) diff --git a/logstable/src/LogsTable.ts b/logstable/src/LogsTable.ts index 050ef140..a5e39a76 100644 --- a/logstable/src/LogsTable.ts +++ b/logstable/src/LogsTable.ts @@ -13,12 +13,16 @@ import { PanelPlugin } from '@perses-dev/plugin-system'; import { LogsTableComponent } from './LogsTableComponent'; -import { LogsTableOptions, LogsTableProps } from './model'; +import { LogsTableItemSelectionActionsEditor } from './LogsTableItemSelectionActionsEditor'; import { LogsTableSettingsEditor } from './LogsTableSettingsEditor'; +import { LogsTableOptions, LogsTableProps } from './model'; export const LogsTable: PanelPlugin = { PanelComponent: LogsTableComponent, - panelOptionsEditorComponents: [{ label: 'Settings', content: LogsTableSettingsEditor }], + panelOptionsEditorComponents: [ + { label: 'Settings', content: LogsTableSettingsEditor }, + { label: 'Item Actions', content: LogsTableItemSelectionActionsEditor }, + ], supportedQueryTypes: ['LogQuery'], createInitialOptions: () => ({ showTime: true, diff --git a/logstable/src/LogsTableItemSelectionActionsEditor.tsx b/logstable/src/LogsTableItemSelectionActionsEditor.tsx new file mode 100644 index 00000000..e94560c7 --- /dev/null +++ b/logstable/src/LogsTableItemSelectionActionsEditor.tsx @@ -0,0 +1,35 @@ +// Copyright The Perses Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { ActionOptions, ItemSelectionActionsEditor, SelectionOptions } from '@perses-dev/plugin-system'; +import { ReactElement } from 'react'; +import { LogsTableSettingsEditorProps } from './model'; + +export function LogsTableItemSelectionActionsEditor({ value, onChange }: LogsTableSettingsEditorProps): ReactElement { + function handleActionsChange(actions: ActionOptions | undefined): void { + onChange({ ...value, actions: actions }); + } + + function handleSelectionChange(selection: SelectionOptions | undefined): void { + onChange({ ...value, selection: selection }); + } + + return ( + + ); +} diff --git a/logstable/src/LogsTableSettingsEditor.tsx b/logstable/src/LogsTableSettingsEditor.tsx index cf04b26e..64b56d28 100644 --- a/logstable/src/LogsTableSettingsEditor.tsx +++ b/logstable/src/LogsTableSettingsEditor.tsx @@ -12,8 +12,8 @@ // limitations under the License. import { - OptionsEditorGrid, OptionsEditorColumn, + OptionsEditorGrid, ThresholdsEditor, ThresholdsEditorProps, } from '@perses-dev/components'; diff --git a/logstable/src/components/LogRow/LogRow.tsx b/logstable/src/components/LogRow/LogRow.tsx index 0d0ba729..6efef10f 100644 --- a/logstable/src/components/LogRow/LogRow.tsx +++ b/logstable/src/components/LogRow/LogRow.tsx @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -import React, { memo, useCallback, useState, useRef, useEffect } from 'react'; +import React, { memo, useCallback, useState, useRef, useEffect, ReactNode } from 'react'; import { Box, Collapse, @@ -48,6 +48,7 @@ interface LogRowProps { allowWrap?: boolean; isSelected?: boolean; onSelect?: (index: number, event: React.MouseEvent) => void; + itemActionButtons?: ReactNode[]; } const DefaultLogRow: React.FC = ({ @@ -60,6 +61,7 @@ const DefaultLogRow: React.FC = ({ allowWrap = false, isSelected = false, onSelect, + itemActionButtons, }) => { const theme = useTheme(); const severityColor = useSeverityColor(log); @@ -143,6 +145,8 @@ const DefaultLogRow: React.FC = ({ if (!log) return null; + const hasRowActions = itemActionButtons && itemActionButtons.length > 0; + return ( = ({ onMouseDown={handleRowMouseDown} isExpandable={isExpandable} isHighlighted={Boolean(anchorEl)} + hasRowActions={hasRowActions} isSelected={isSelected} > {isExpandable && ( @@ -223,6 +228,20 @@ const DefaultLogRow: React.FC = ({ )} + {hasRowActions && ( + + {itemActionButtons} + + )} prop !== 'isExpandable' && prop !== 'isHighlighted' && prop !== 'isSelected', -})<{ isExpandable: boolean; isHighlighted?: boolean; isSelected?: boolean }>( - ({ theme, isExpandable, isHighlighted, isSelected }) => ({ + shouldForwardProp: (prop) => + prop !== 'isExpandable' && prop !== 'isHighlighted' && prop !== 'isSelected' && prop !== 'hasRowActions', +})<{ isExpandable: boolean; isHighlighted?: boolean; isSelected?: boolean; hasRowActions?: boolean }>( + ({ theme, isExpandable, isHighlighted, isSelected, hasRowActions }) => ({ display: 'grid', - gridTemplateColumns: isExpandable ? '16px minmax(160px, max-content) 1fr' : 'minmax(160px, max-content) 1fr', + gridTemplateColumns: isExpandable + ? `16px minmax(160px, max-content) 1fr ${hasRowActions ? 'min-content' : ''}` + : `minmax(160px, max-content) 1fr ${hasRowActions ? 'min-content' : ''}`, alignItems: 'flex-start', padding: '4px 8px', cursor: 'default', diff --git a/logstable/src/components/VirtualizedLogsList.tsx b/logstable/src/components/VirtualizedLogsList.tsx index 8bc33f49..ffd7341e 100644 --- a/logstable/src/components/VirtualizedLogsList.tsx +++ b/logstable/src/components/VirtualizedLogsList.tsx @@ -11,11 +11,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -import React, { useCallback, useState, useEffect, useRef } from 'react'; +import React, { useCallback, useState, useEffect, useRef, ReactNode } from 'react'; import { Box, useTheme, Popover, Button, ButtonGroup, IconButton } from '@mui/material'; import CloseIcon from 'mdi-material-ui/Close'; import { Virtuoso } from 'react-virtuoso'; import { LogEntry } from '@perses-dev/core'; +import { useSelection } from '@perses-dev/components'; +import { useSelectionItemActions } from '@perses-dev/dashboards'; +import { ActionsOptions, useAllVariableValues } from '@perses-dev/plugin-system'; import { formatLogEntries, formatLogMessage } from '../utils/copyHelpers'; import { LogsTableOptions } from '../model'; import { LogRow } from './LogRow'; @@ -55,11 +58,40 @@ export const VirtualizedLogsList: React.FC = ({ } }); - // Keep ref in sync with state + const selectionEnabled = spec.selection?.enabled ?? false; + const { setSelection, clearSelection } = useSelection(); + + const allVariables = useAllVariableValues(); + const itemActionsConfig = spec.actions ? (spec.actions as ActionsOptions) : undefined; + const itemActionsListConfig = + itemActionsConfig?.enabled && itemActionsConfig.displayWithItem ? itemActionsConfig.actionsList : []; + + const { getItemActionButtons, confirmDialog } = useSelectionItemActions({ + actions: itemActionsListConfig, + variableState: allVariables, + }); + useEffect(() => { selectedRowsRef.current = selectedRows; }, [selectedRows]); + // Sync local selection state with context when selection is enabled + useEffect(() => { + if (!selectionEnabled) return; + + if (selectedRows.size === 0) { + clearSelection(); + } else { + const selectionItems = Array.from(selectedRows) + .map((index) => { + const log = logs[index]; + return log ? { id: index, item: log } : null; + }) + .filter((entry): entry is { id: number; item: LogEntry } => entry !== null); + setSelection(selectionItems); + } + }, [selectedRows, logs, selectionEnabled, setSelection, clearSelection]); + const handleDismissHints = useCallback(() => { setIsHintsDismissed(true); try { @@ -166,6 +198,10 @@ export const VirtualizedLogsList: React.FC = ({ const log = logs[index]; if (!log) return null; + const itemActionButtons: ReactNode[] = itemActionsListConfig?.length + ? getItemActionButtons({ id: index, data: log as unknown as Record }) + : []; + return ( = ({ showTime={spec.showTime} isSelected={selectedRows.has(index)} onSelect={handleRowSelect} + itemActionButtons={itemActionButtons} /> ); }; @@ -257,163 +294,169 @@ export const VirtualizedLogsList: React.FC = ({ }, []); return ( - - {!isHintsDismissed && ( - - - - {isMac ? '⌘' : 'Ctrl'}+Click to select - - - • - - - Shift+Click for range - - - • - - - {isMac ? '⌘' : 'Ctrl'}+C to copy - - - • - - - Esc to clear - - - - - - - )} - - + {confirmDialog} + - + {!isHintsDismissed && ( - ✓ Copied {lastCopiedCount} {lastCopiedCount === 1 ? 'log' : 'logs'} as{' '} - - {lastCopiedFormat === 'full' ? 'Full' : lastCopiedFormat === 'message' ? 'Message' : 'JSON'} + + + {isMac ? '⌘' : 'Ctrl'}+Click to select + + + • + + + Shift+Click for range + + + • + + + {isMac ? '⌘' : 'Ctrl'}+C to copy + + + • + + + Esc to clear + - - - - - - - - - + ✓ Copied {lastCopiedCount} {lastCopiedCount === 1 ? 'log' : 'logs'} as{' '} + + {lastCopiedFormat === 'full' ? 'Full' : lastCopiedFormat === 'message' ? 'Message' : 'JSON'} + + + + + + + + + + + ); }; diff --git a/logstable/src/model.ts b/logstable/src/model.ts index 321956cb..7c1f7147 100644 --- a/logstable/src/model.ts +++ b/logstable/src/model.ts @@ -12,7 +12,13 @@ // limitations under the License. import { LogData, ThresholdOptions } from '@perses-dev/core'; -import { PanelProps, LegendSpecOptions } from '@perses-dev/plugin-system'; +import { + PanelProps, + LegendSpecOptions, + SelectionOptions, + OptionsEditorProps, + ActionsOptions, +} from '@perses-dev/plugin-system'; export type LogsTableProps = PanelProps; @@ -27,4 +33,8 @@ export interface LogsTableOptions { enableDetails?: boolean; showTime?: boolean; showAll?: boolean; + selection?: SelectionOptions; + actions?: ActionsOptions; } + +export type LogsTableSettingsEditorProps = OptionsEditorProps; diff --git a/package-lock.json b/package-lock.json index 1f0b7159..88f439bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,11 +35,11 @@ ], "devDependencies": { "@module-federation/rsbuild-plugin": "^0.21.6", - "@perses-dev/components": "^0.53.0-rc.1", + "@perses-dev/components": "file:../shared/components", "@perses-dev/core": "^0.53.0-beta.4", - "@perses-dev/dashboards": "^0.53.0-rc.1", - "@perses-dev/explore": "^0.53.0-rc.1", - "@perses-dev/plugin-system": "^0.53.0-rc.1", + "@perses-dev/dashboards": "file:../shared/dashboards", + "@perses-dev/explore": "file:../shared/explore", + "@perses-dev/plugin-system": "file:../shared/plugin-system", "@rsbuild/core": "^1.6.7", "@rsbuild/plugin-react": "^1.4.2", "@swc/cli": "^0.7.9", @@ -81,6 +81,136 @@ "react-dom": "^17.0.2 || ^18.0.0" } }, + "../shared/components": { + "name": "@perses-dev/components", + "version": "0.53.0-rc.1", + "license": "Apache-2.0", + "dependencies": { + "@atlaskit/pragmatic-drag-and-drop": "^1.4.0", + "@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.0.3", + "@codemirror/lang-json": "^6.0.1", + "@fontsource/lato": "^4.5.10", + "@mui/x-date-pickers": "^7.23.1", + "@perses-dev/core": "0.53.0-rc.0", + "@tanstack/react-table": "^8.20.5", + "@uiw/react-codemirror": "^4.19.1", + "date-fns": "^4.1.0", + "date-fns-tz": "^3.2.0", + "echarts": "5.5.0", + "immer": "^10.1.1", + "lodash": "^4.17.21", + "mathjs": "^10.6.4", + "mdi-material-ui": "^7.9.2", + "notistack": "^3.0.2", + "react-colorful": "^5.6.1", + "react-error-boundary": "^3.1.4", + "react-hook-form": "^7.51.3", + "react-virtuoso": "^4.12.2" + }, + "devDependencies": { + "@types/lodash": "^4.17.20" + }, + "peerDependencies": { + "@mui/material": "^6.1.10", + "lodash": "^4.17.21", + "react": "^17.0.2 || ^18.0.0", + "react-dom": "^17.0.2 || ^18.0.0" + } + }, + "../shared/dashboards": { + "name": "@perses-dev/dashboards", + "version": "0.53.0-rc.1", + "license": "Apache-2.0", + "dependencies": { + "@perses-dev/components": "0.53.0-rc.1", + "@perses-dev/core": "0.53.0-rc.0", + "@perses-dev/plugin-system": "0.53.0-rc.1", + "@types/react-grid-layout": "^1.3.2", + "date-fns": "^4.1.0", + "immer": "^10.1.1", + "mdi-material-ui": "^7.9.2", + "react-grid-layout": "^1.3.4", + "react-hook-form": "^7.46.1", + "react-intersection-observer": "^9.4.0", + "use-immer": "^0.11.0", + "use-query-params": "^2.2.1", + "use-resize-observer": "^9.0.0", + "yaml": "^2.7.0", + "zustand": "^4.3.3" + }, + "devDependencies": { + "history": "^5.3.0", + "intersection-observer": "^0.12.2" + }, + "peerDependencies": { + "@mui/material": "^6.1.10", + "@tanstack/react-query": "^4.39.1", + "react": "^17.0.2 || ^18.0.0", + "react-dom": "^17.0.2 || ^18.0.0" + } + }, + "../shared/explore": { + "name": "@perses-dev/explore", + "version": "0.53.0-rc.1", + "license": "Apache-2.0", + "dependencies": { + "@nexucis/fuzzy": "^0.5.1", + "@perses-dev/components": "0.53.0-rc.1", + "@perses-dev/core": "0.53.0-rc.0", + "@perses-dev/dashboards": "0.53.0-rc.1", + "@perses-dev/plugin-system": "0.53.0-rc.1", + "@types/react-grid-layout": "^1.3.2", + "date-fns": "^4.1.0", + "immer": "^10.1.1", + "mdi-material-ui": "^7.9.2", + "qs": "^6.14.0", + "react-grid-layout": "^1.3.4", + "react-hook-form": "^7.46.1", + "react-intersection-observer": "^9.4.0", + "react-virtuoso": "^4.12.2", + "use-immer": "^0.11.0", + "use-query-params": "^2.2.1", + "use-resize-observer": "^9.0.0", + "zod": "^3.21.4", + "zustand": "^4.3.3" + }, + "devDependencies": { + "@types/qs": "^6.14.0", + "history": "^5.3.0", + "intersection-observer": "^0.12.2", + "react-router-dom": "^6.30.1" + }, + "peerDependencies": { + "@mui/material": "^6.1.10", + "@tanstack/react-query": "^4.39.1", + "react": "^17.0.2 || ^18.0.0", + "react-dom": "^17.0.2 || ^18.0.0" + } + }, + "../shared/plugin-system": { + "name": "@perses-dev/plugin-system", + "version": "0.53.0-rc.1", + "license": "Apache-2.0", + "dependencies": { + "@module-federation/enhanced": "^0.21.4", + "@perses-dev/components": "0.53.0-rc.1", + "@perses-dev/core": "0.53.0-rc.0", + "date-fns": "^4.1.0", + "date-fns-tz": "^3.2.0", + "immer": "^10.1.1", + "react-hook-form": "^7.46.1", + "use-immer": "^0.11.0", + "use-query-params": "^2.2.1", + "zod": "^3.22.2" + }, + "peerDependencies": { + "@hookform/resolvers": "^3.2.0", + "@mui/material": "^6.1.10", + "@tanstack/react-query": "^4.39.1", + "react": "^17.0.2 || ^18.0.0", + "react-dom": "^17.0.2 || ^18.0.0" + } + }, "barchart": { "name": "@perses-dev/bar-chart-plugin", "version": "0.11.0-rc.0", @@ -481,27 +611,6 @@ "node": ">= 10" } }, - "node_modules/@atlaskit/pragmatic-drag-and-drop": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop/-/pragmatic-drag-and-drop-1.5.2.tgz", - "integrity": "sha512-fDuTwlDD11r3ev5tLJ6JnzQUiG9v77c8zGcNdO7RRNtZZbOHam8CFhmyFGY4E/mLjvgYng0UkcyCrSBc4FXYZw==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.0.0", - "bind-event-listener": "^3.0.0", - "raf-schd": "^4.0.3" - } - }, - "node_modules/@atlaskit/pragmatic-drag-and-drop-hitbox": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@atlaskit/pragmatic-drag-and-drop-hitbox/-/pragmatic-drag-and-drop-hitbox-1.0.3.tgz", - "integrity": "sha512-/Sbu/HqN2VGLYBhnsG7SbRNg98XKkbF6L7XDdBi+izRybfaK1FeMfodPpm/xnBHPJzwYMdkE0qtLyv6afhgMUA==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/pragmatic-drag-and-drop": "^1.1.0", - "@babel/runtime": "^7.0.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", @@ -1037,6 +1146,7 @@ "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.8.0.tgz", "integrity": "sha512-q8VPEFaEP4ikSlt6ZxjB3zW72+7osfAYW9i8Zu943uqbKuz6utc1+F170hyLUCUltXORjQXRyYQNfkckzA/bPQ==", "license": "MIT", + "peer": true, "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.4.0", @@ -1044,16 +1154,6 @@ "@lezer/common": "^1.1.0" } }, - "node_modules/@codemirror/lang-json": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@codemirror/lang-json/-/lang-json-6.0.1.tgz", - "integrity": "sha512-+T1flHdgpqDDlJZ2Lkil/rLiRy684WMLc74xUnjJH48GQdfJo/pudlTRreZmKwzP8/tGdKf83wlbAdOCzlJOGQ==", - "license": "MIT", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@lezer/json": "^1.0.0" - } - }, "node_modules/@codemirror/language": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.0.tgz", @@ -1073,6 +1173,7 @@ "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.4.tgz", "integrity": "sha512-u4q7PnZlJUojeRe8FJa/njJcMctISGgPQ4PnWsd9268R4ZTtU+tfFYmwkBvgcrK2+QQ8tYFVALVb5fVJykKc5A==", "license": "MIT", + "peer": true, "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.35.0", @@ -1084,6 +1185,7 @@ "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.10.tgz", "integrity": "sha512-RMdPdmsrUf53pb2VwflKGHEe1XVM07hI7vV2ntgw1dmqhimpatSJKva4VA9h4TLUDOD4EIF02201oZurpnEFsg==", "license": "MIT", + "peer": true, "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", @@ -1104,6 +1206,7 @@ "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.2.tgz", "integrity": "sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==", "license": "MIT", + "peer": true, "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", @@ -1150,6 +1253,7 @@ "version": "1.7.1", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.7.1.tgz", "integrity": "sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -1161,6 +1265,7 @@ "version": "1.7.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -1171,6 +1276,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -1865,12 +1971,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@fontsource/lato": { - "version": "4.5.10", - "resolved": "https://registry.npmjs.org/@fontsource/lato/-/lato-4.5.10.tgz", - "integrity": "sha512-2hYR6r661Cq9B8zugtu6yxuOKqrVhAgfOSaPSq8XoxbC4ebsl0KOTy/vPoP+9U7JuQVLfrmikirW4a9Z0nDUug==", - "license": "MIT" - }, "node_modules/@grafana/lezer-logql": { "version": "0.2.8", "resolved": "https://registry.npmjs.org/@grafana/lezer-logql/-/lezer-logql-0.2.8.tgz", @@ -2517,7 +2617,7 @@ "version": "0.3.11", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -2545,7 +2645,8 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/@lezer/common": { "version": "1.4.0", @@ -2562,17 +2663,6 @@ "@lezer/common": "^1.3.0" } }, - "node_modules/@lezer/json": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@lezer/json/-/json-1.0.3.tgz", - "integrity": "sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, "node_modules/@lezer/lr": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", @@ -2592,6 +2682,7 @@ "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/bridge-react-webpack-plugin/-/bridge-react-webpack-plugin-0.21.6.tgz", "integrity": "sha512-lJMmdhD4VKVkeg8RHb+Jwe6Ou9zKVgjtb1inEURDG/sSS2ksdZA8pVKLYbRPRbdmjr193Y8gJfqFbI2dqoyc/g==", + "dev": true, "license": "MIT", "dependencies": { "@module-federation/sdk": "0.21.6", @@ -2603,6 +2694,7 @@ "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2615,6 +2707,7 @@ "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/cli/-/cli-0.21.6.tgz", "integrity": "sha512-qNojnlc8pTyKtK7ww3i/ujLrgWwgXqnD5DcDPsjADVIpu7STaoaVQ0G5GJ7WWS/ajXw6EyIAAGW/AMFh4XUxsQ==", + "dev": true, "license": "MIT", "dependencies": { "@module-federation/dts-plugin": "0.21.6", @@ -2634,6 +2727,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -2647,6 +2741,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" @@ -2656,6 +2751,7 @@ "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/data-prefetch/-/data-prefetch-0.21.6.tgz", "integrity": "sha512-8HD7ZhtWZ9vl6i3wA7M8cEeCRdtvxt09SbMTfqIPm+5eb/V4ijb8zGTYSRhNDb5RCB+BAixaPiZOWKXJ63/rVw==", + "dev": true, "license": "MIT", "dependencies": { "@module-federation/runtime": "0.21.6", @@ -2671,6 +2767,7 @@ "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/dts-plugin/-/dts-plugin-0.21.6.tgz", "integrity": "sha512-YIsDk8/7QZIWn0I1TAYULniMsbyi2LgKTi9OInzVmZkwMC6644x/ratTWBOUDbdY1Co+feNkoYeot1qIWv2L7w==", + "dev": true, "license": "MIT", "dependencies": { "@module-federation/error-codes": "0.21.6", @@ -2704,6 +2801,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -2717,6 +2815,7 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" @@ -2738,6 +2837,7 @@ "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/enhanced/-/enhanced-0.21.6.tgz", "integrity": "sha512-8PFQxtmXc6ukBC4CqGIoc96M2Ly9WVwCPu4Ffvt+K/SB6rGbeFeZoYAwREV1zGNMJ5v5ly6+AHIEOBxNuSnzSg==", + "dev": true, "license": "MIT", "dependencies": { "@module-federation/bridge-react-webpack-plugin": "0.21.6", @@ -2779,12 +2879,14 @@ "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.21.6.tgz", "integrity": "sha512-MLJUCQ05KnoVl8xd6xs9a5g2/8U+eWmVxg7xiBMeR0+7OjdWUbHwcwgVFatRIwSZvFgKHfWEiI7wsU1q1XbTRQ==", + "dev": true, "license": "MIT" }, "node_modules/@module-federation/inject-external-runtime-core-plugin": { "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/inject-external-runtime-core-plugin/-/inject-external-runtime-core-plugin-0.21.6.tgz", "integrity": "sha512-DJQne7NQ988AVi3QB8byn12FkNb+C2lBeU1NRf8/WbL0gmHsr6kW8hiEJCm8LYaURwtsQqtsEV7i+8+51qjSmQ==", + "dev": true, "license": "MIT", "peerDependencies": { "@module-federation/runtime-tools": "0.21.6" @@ -2794,6 +2896,7 @@ "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/managers/-/managers-0.21.6.tgz", "integrity": "sha512-BeV6m2/7kF5MDVz9JJI5T8h8lMosnXkH2bOxxFewcra7ZjvDOgQu7WIio0mgk5l1zjNPvnEVKhnhrenEdcCiWg==", + "dev": true, "license": "MIT", "dependencies": { "@module-federation/sdk": "0.21.6", @@ -2805,6 +2908,7 @@ "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/manifest/-/manifest-0.21.6.tgz", "integrity": "sha512-yg93+I1qjRs5B5hOSvjbjmIoI2z3th8/yst9sfwvx4UDOG1acsE3HHMyPN0GdoIGwplC/KAnU5NmUz4tREUTGQ==", + "dev": true, "license": "MIT", "dependencies": { "@module-federation/dts-plugin": "0.21.6", @@ -2818,6 +2922,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", @@ -2911,6 +3016,7 @@ "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/rspack/-/rspack-0.21.6.tgz", "integrity": "sha512-SB+z1P+Bqe3R6geZje9dp0xpspX6uash+zO77nodmUy8PTTBlkL7800Cq2FMLKUdoTZHJTBVXf0K6CqQWSlItg==", + "dev": true, "license": "MIT", "dependencies": { "@module-federation/bridge-react-webpack-plugin": "0.21.6", @@ -2940,6 +3046,7 @@ "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.21.6.tgz", "integrity": "sha512-+caXwaQqwTNh+CQqyb4mZmXq7iEemRDrTZQGD+zyeH454JAYnJ3s/3oDFizdH6245pk+NiqDyOOkHzzFQorKhQ==", + "dev": true, "license": "MIT", "dependencies": { "@module-federation/error-codes": "0.21.6", @@ -2951,6 +3058,7 @@ "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.21.6.tgz", "integrity": "sha512-5Hd1Y5qp5lU/aTiK66lidMlM/4ji2gr3EXAtJdreJzkY+bKcI5+21GRcliZ4RAkICmvdxQU5PHPL71XmNc7Lsw==", + "dev": true, "license": "MIT", "dependencies": { "@module-federation/error-codes": "0.21.6", @@ -2961,6 +3069,7 @@ "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.21.6.tgz", "integrity": "sha512-fnP+ZOZTFeBGiTAnxve+axGmiYn2D60h86nUISXjXClK3LUY1krUfPgf6MaD4YDJ4i51OGXZWPekeMe16pkd8Q==", + "dev": true, "license": "MIT", "dependencies": { "@module-federation/runtime": "0.21.6", @@ -2971,12 +3080,14 @@ "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.21.6.tgz", "integrity": "sha512-x6hARETb8iqHVhEsQBysuWpznNZViUh84qV2yE7AD+g7uIzHKiYdoWqj10posbo5XKf/147qgWDzKZoKoEP2dw==", + "dev": true, "license": "MIT" }, "node_modules/@module-federation/third-party-dts-extractor": { "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/third-party-dts-extractor/-/third-party-dts-extractor-0.21.6.tgz", "integrity": "sha512-Il6x4hLsvCgZNk1DFwuMBNeoxD1BsZ5AW2BI/nUgu0k5FiAvfcz1OFawRFEHtaM/kVrCsymMOW7pCao90DaX3A==", + "dev": true, "license": "MIT", "dependencies": { "find-pkg": "2.0.0", @@ -2988,6 +3099,7 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -3005,6 +3117,7 @@ "version": "0.21.6", "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.21.6.tgz", "integrity": "sha512-7zIp3LrcWbhGuFDTUMLJ2FJvcwjlddqhWGxi/MW3ur1a+HaO8v5tF2nl+vElKmbG1DFLU/52l3PElVcWf/YcsQ==", + "dev": true, "license": "MIT", "dependencies": { "@module-federation/runtime": "0.21.6", @@ -3271,72 +3384,6 @@ } } }, - "node_modules/@mui/x-date-pickers": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.28.0.tgz", - "integrity": "sha512-m1bfkZLOw3cMogeh6q92SjykVmLzfptnz3ZTgAlFKV7UBnVFuGUITvmwbgTZ1Mz3FmLVnGUQYUpZWw0ZnoghNA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", - "@mui/x-internals": "7.28.0", - "@types/react-transition-group": "^4.4.11", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-transition-group": "^4.4.5" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.9.0", - "@emotion/styled": "^11.8.1", - "@mui/material": "^5.15.14 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", - "@mui/system": "^5.15.14 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", - "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", - "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0 || ^4.0.0-0", - "dayjs": "^1.10.7", - "luxon": "^3.0.2", - "moment": "^2.29.4", - "moment-hijri": "^2.1.2 || ^3.0.0", - "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "date-fns": { - "optional": true - }, - "date-fns-jalali": { - "optional": true - }, - "dayjs": { - "optional": true - }, - "luxon": { - "optional": true - }, - "moment": { - "optional": true - }, - "moment-hijri": { - "optional": true - }, - "moment-jalaali": { - "optional": true - } - } - }, "node_modules/@mui/x-internals": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.28.0.tgz", @@ -3649,6 +3696,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz", "integrity": "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -3710,38 +3758,8 @@ "link": true }, "node_modules/@perses-dev/components": { - "version": "0.53.0-rc.1", - "resolved": "https://registry.npmjs.org/@perses-dev/components/-/components-0.53.0-rc.1.tgz", - "integrity": "sha512-yp8pzcPe2XyE21qBLAujk+gMIl07InIaY/hq19YGAeu9ycxi2hRKily0S89qEmhjS525KJHka+f6wjEztJFnlg==", - "license": "Apache-2.0", - "dependencies": { - "@atlaskit/pragmatic-drag-and-drop": "^1.4.0", - "@atlaskit/pragmatic-drag-and-drop-hitbox": "^1.0.3", - "@codemirror/lang-json": "^6.0.1", - "@fontsource/lato": "^4.5.10", - "@mui/x-date-pickers": "^7.23.1", - "@perses-dev/core": "0.53.0-beta.4", - "@tanstack/react-table": "^8.20.5", - "@uiw/react-codemirror": "^4.19.1", - "date-fns": "^4.1.0", - "date-fns-tz": "^3.2.0", - "echarts": "5.5.0", - "immer": "^10.1.1", - "lodash": "^4.17.21", - "mathjs": "^10.6.4", - "mdi-material-ui": "^7.9.2", - "notistack": "^3.0.2", - "react-colorful": "^5.6.1", - "react-error-boundary": "^3.1.4", - "react-hook-form": "^7.51.3", - "react-virtuoso": "^4.12.2" - }, - "peerDependencies": { - "@mui/material": "^6.1.10", - "lodash": "^4.17.21", - "react": "^17.0.2 || ^18.0.0", - "react-dom": "^17.0.2 || ^18.0.0" - } + "resolved": "../shared/components", + "link": true }, "node_modules/@perses-dev/core": { "version": "0.53.0-beta.4", @@ -3757,70 +3775,16 @@ } }, "node_modules/@perses-dev/dashboards": { - "version": "0.53.0-rc.1", - "resolved": "https://registry.npmjs.org/@perses-dev/dashboards/-/dashboards-0.53.0-rc.1.tgz", - "integrity": "sha512-ndpz6I+fQiHEtQyvmD/hBjinj8Hk3pdwsBCoWFuUsCgNEt+uuukL/dT1nK5F3P3QEGwIb0eMtSQ1cGl1jtKtiA==", - "license": "Apache-2.0", - "dependencies": { - "@perses-dev/components": "0.53.0-rc.1", - "@perses-dev/core": "0.53.0-beta.4", - "@perses-dev/plugin-system": "0.53.0-rc.1", - "@types/react-grid-layout": "^1.3.2", - "date-fns": "^4.1.0", - "immer": "^10.1.1", - "mdi-material-ui": "^7.9.2", - "react-grid-layout": "^1.3.4", - "react-hook-form": "^7.46.1", - "react-intersection-observer": "^9.4.0", - "use-immer": "^0.11.0", - "use-query-params": "^2.2.1", - "use-resize-observer": "^9.0.0", - "yaml": "^2.7.0", - "zustand": "^4.3.3" - }, - "peerDependencies": { - "@mui/material": "^6.1.10", - "@tanstack/react-query": "^4.39.1", - "react": "^17.0.2 || ^18.0.0", - "react-dom": "^17.0.2 || ^18.0.0" - } + "resolved": "../shared/dashboards", + "link": true }, "node_modules/@perses-dev/datasource-variable-plugin": { "resolved": "datasourcevariable", "link": true }, "node_modules/@perses-dev/explore": { - "version": "0.53.0-rc.1", - "resolved": "https://registry.npmjs.org/@perses-dev/explore/-/explore-0.53.0-rc.1.tgz", - "integrity": "sha512-mPk4jq+yOveZ+GcmNsJuiaql9/KI5YiLINl6fSq+cajBBZMviRomidFccbQcoVFXSgtssZeY4cXLkdQFyNgT4A==", - "license": "Apache-2.0", - "dependencies": { - "@nexucis/fuzzy": "^0.5.1", - "@perses-dev/components": "0.53.0-rc.1", - "@perses-dev/core": "0.53.0-beta.4", - "@perses-dev/dashboards": "0.53.0-rc.1", - "@perses-dev/plugin-system": "0.53.0-rc.1", - "@types/react-grid-layout": "^1.3.2", - "date-fns": "^4.1.0", - "immer": "^10.1.1", - "mdi-material-ui": "^7.9.2", - "qs": "^6.14.0", - "react-grid-layout": "^1.3.4", - "react-hook-form": "^7.46.1", - "react-intersection-observer": "^9.4.0", - "react-virtuoso": "^4.12.2", - "use-immer": "^0.11.0", - "use-query-params": "^2.2.1", - "use-resize-observer": "^9.0.0", - "zod": "^3.21.4", - "zustand": "^4.3.3" - }, - "peerDependencies": { - "@mui/material": "^6.1.10", - "@tanstack/react-query": "^4.39.1", - "react": "^17.0.2 || ^18.0.0", - "react-dom": "^17.0.2 || ^18.0.0" - } + "resolved": "../shared/explore", + "link": true }, "node_modules/@perses-dev/flame-chart-plugin": { "resolved": "flamechart", @@ -3855,29 +3819,8 @@ "link": true }, "node_modules/@perses-dev/plugin-system": { - "version": "0.53.0-rc.1", - "resolved": "https://registry.npmjs.org/@perses-dev/plugin-system/-/plugin-system-0.53.0-rc.1.tgz", - "integrity": "sha512-RECE2Yms5fBU8+OjVNm4nu3RbPOl9eelKwrsBJpcg+iWG8cARK/IQGlICRVVuo4vv50pqaK6fijMt2TYppFtYA==", - "license": "Apache-2.0", - "dependencies": { - "@module-federation/enhanced": "^0.21.4", - "@perses-dev/components": "0.53.0-rc.1", - "@perses-dev/core": "0.53.0-beta.4", - "date-fns": "^4.1.0", - "date-fns-tz": "^3.2.0", - "immer": "^10.1.1", - "react-hook-form": "^7.46.1", - "use-immer": "^0.11.0", - "use-query-params": "^2.2.1", - "zod": "^3.22.2" - }, - "peerDependencies": { - "@hookform/resolvers": "^3.2.0", - "@mui/material": "^6.1.10", - "@tanstack/react-query": "^4.39.1", - "react": "^17.0.2 || ^18.0.0", - "react-dom": "^17.0.2 || ^18.0.0" - } + "resolved": "../shared/plugin-system", + "link": true }, "node_modules/@perses-dev/prometheus-plugin": { "resolved": "prometheus", @@ -4041,6 +3984,7 @@ "version": "1.6.4", "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.6.4.tgz", "integrity": "sha512-vUxc/zUdsCuyysOvP4CTdIYxsZPb2jIXST5vrLABiTPIaHpXZ0hVdgKif2XPJwJeuCVS6w25xvyPN0mBCU0MvQ==", + "dev": true, "license": "MIT", "optionalDependencies": { "@rspack/binding-darwin-arm64": "1.6.4", @@ -4062,6 +4006,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4075,6 +4020,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4088,6 +4034,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4101,6 +4048,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4114,6 +4062,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4127,6 +4076,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4140,6 +4090,7 @@ "cpu": [ "wasm32" ], + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -4153,6 +4104,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4166,6 +4118,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4179,6 +4132,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4189,6 +4143,7 @@ "version": "1.6.4", "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.6.4.tgz", "integrity": "sha512-5F1+MQD8rfbFbUHnaiZe4jqOu9pnSb+PliqQvi0lj+uvpMpcS3sJDIs/mz6P1u87lfkfBXChIT4zSLAzeOgMWw==", + "dev": true, "license": "MIT", "dependencies": { "@module-federation/runtime-tools": "0.21.4", @@ -4211,12 +4166,14 @@ "version": "0.21.4", "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.21.4.tgz", "integrity": "sha512-ClpL5MereWNXh+EgDjz7w4RrC1JlisQTvXDa1gLxpviHafzNDfdViVmuhi9xXVuj+EYo8KU70Y999KHhk9424Q==", + "dev": true, "license": "MIT" }, "node_modules/@rspack/core/node_modules/@module-federation/runtime": { "version": "0.21.4", "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.21.4.tgz", "integrity": "sha512-wgvGqryurVEvkicufJmTG0ZehynCeNLklv8kIk5BLIsWYSddZAE+xe4xov1kgH5fIJQAoQNkRauFFjVNlHoAkA==", + "dev": true, "license": "MIT", "dependencies": { "@module-federation/error-codes": "0.21.4", @@ -4228,6 +4185,7 @@ "version": "0.21.4", "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.21.4.tgz", "integrity": "sha512-SGpmoOLGNxZofpTOk6Lxb2ewaoz5wMi93AFYuuJB04HTVcngEK+baNeUZ2D/xewrqNIJoMY6f5maUjVfIIBPUA==", + "dev": true, "license": "MIT", "dependencies": { "@module-federation/error-codes": "0.21.4", @@ -4238,6 +4196,7 @@ "version": "0.21.4", "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.21.4.tgz", "integrity": "sha512-RzFKaL0DIjSmkn76KZRfzfB6dD07cvID84950jlNQgdyoQFUGkqD80L6rIpVCJTY/R7LzR3aQjHnoqmq4JPo3w==", + "dev": true, "license": "MIT", "dependencies": { "@module-federation/runtime": "0.21.4", @@ -4248,12 +4207,14 @@ "version": "0.21.4", "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.21.4.tgz", "integrity": "sha512-tzvhOh/oAfX++6zCDDxuvioHY4Jurf8vcfoCbKFxusjmyKr32GPbwFDazUP+OPhYCc3dvaa9oWU6X/qpUBLfJw==", + "dev": true, "license": "MIT" }, "node_modules/@rspack/core/node_modules/@module-federation/webpack-bundler-runtime": { "version": "0.21.4", "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.21.4.tgz", "integrity": "sha512-dusmR3uPnQh9u9ChQo3M+GLOuGFthfvnh7WitF/a1eoeTfRmXqnMFsXtZCUK+f/uXf+64874Zj/bhAgbBcVHZA==", + "dev": true, "license": "MIT", "dependencies": { "@module-federation/runtime": "0.21.4", @@ -4264,6 +4225,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz", "integrity": "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==", + "dev": true, "license": "MIT" }, "node_modules/@rspack/plugin-react-refresh": { @@ -4611,7 +4573,7 @@ "version": "0.5.17", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", - "devOptional": true, + "dev": true, "dependencies": { "tslib": "^2.8.0" } @@ -4687,6 +4649,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.2.tgz", "integrity": "sha512-11tNlEDTdIhMJba2RBH+ecJ9l1zgS2kjmexDPAraulc8jeNA4xocSNeyzextT0XJyASil4XsCYlJmf5jEWAtYg==", "license": "MIT", + "peer": true, "dependencies": { "@tanstack/table-core": "8.21.2" }, @@ -4707,6 +4670,7 @@ "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.2.tgz", "integrity": "sha512-uvXk/U4cBiFMxt+p9/G7yUWI/UbHYbyghLCjlpWZ3mLeIZiUBSKcUnw9UnKkdRz7Z/N4UBuFLWQdJCjUe7HjvA==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -4870,6 +4834,7 @@ "version": "0.10.1", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -4967,7 +4932,7 @@ "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -4979,7 +4944,7 @@ "version": "3.7.7", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -4991,7 +4956,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true }, @@ -5132,6 +5097,7 @@ "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, "license": "MIT" }, "node_modules/@types/json5": { @@ -5159,7 +5125,7 @@ "version": "22.13.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.13.tgz", "integrity": "sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.20.0" @@ -5197,6 +5163,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -5212,20 +5179,12 @@ "@types/react": "^18.0.0" } }, - "node_modules/@types/react-grid-layout": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/react-grid-layout/-/react-grid-layout-1.3.5.tgz", - "integrity": "sha512-WH/po1gcEcoR6y857yAnPGug+ZhkF4PaTUxgAbwfeSH/QOgVSakKHBXoPGad/sEznmkiaK3pqHk+etdWisoeBQ==", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/react-transition-group": { "version": "4.4.12", "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "*" } @@ -5234,6 +5193,7 @@ "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true, "license": "MIT" }, "node_modules/@types/send": { @@ -5496,6 +5456,7 @@ "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.25.3.tgz", "integrity": "sha512-F1doRyD50CWScwGHG2bBUtUpwnOv/zqSnzkZqJcX5YAHQx6Z1CuX8jdnFMH6qktRrPU1tfpNYftTWu3QIoHiMA==", "license": "MIT", + "peer": true, "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/commands": "^6.0.0", @@ -5523,6 +5484,7 @@ "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.25.3.tgz", "integrity": "sha512-1wtBZTXPIp8u6F/xjHvsUAYlEeF5Dic4xZBnqJyLzv7o7GjGYEUfSz9Z7bo9aK9GAx2uojG/AuBMfhA4uhvIVQ==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.6", "@codemirror/commands": "^6.1.0", @@ -5555,7 +5517,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -5567,7 +5529,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true }, @@ -5575,7 +5537,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true }, @@ -5583,7 +5545,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true }, @@ -5591,7 +5553,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -5604,7 +5566,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true }, @@ -5612,7 +5574,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -5626,7 +5588,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -5637,7 +5599,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { @@ -5648,7 +5610,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true }, @@ -5656,7 +5618,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -5674,7 +5636,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -5689,7 +5651,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -5703,7 +5665,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -5719,7 +5681,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -5879,7 +5841,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "devOptional": true, + "dev": true, "license": "BSD-3-Clause", "peer": true }, @@ -5887,7 +5849,7 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "peer": true }, @@ -5903,6 +5865,7 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, "license": "MIT", "dependencies": { "mime-types": "~2.1.34", @@ -5916,7 +5879,7 @@ "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "devOptional": true, + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -5940,7 +5903,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "engines": { @@ -5977,6 +5940,7 @@ "version": "0.5.16", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=12.0" @@ -6016,6 +5980,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, "license": "MIT", "dependencies": { "ajv": "^8.0.0" @@ -6033,6 +5998,7 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -6049,12 +6015,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, "license": "MIT" }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -6103,6 +6071,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -6358,12 +6327,14 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, "license": "ISC", "engines": { "node": ">= 4.0.0" @@ -6399,6 +6370,7 @@ "version": "1.13.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "dev": true, "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -6640,12 +6612,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bind-event-listener": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bind-event-listener/-/bind-event-listener-3.0.0.tgz", - "integrity": "sha512-PJvH288AWQhKs2v9zyfYdPzlPqf5bXbGMmhmUIY9x4dAUGIWgomO771oBQNwJnMQSnUIXhKu6sgzpBRXTlvb8Q==", - "license": "MIT" - }, "node_modules/body-parser": { "version": "1.20.4", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", @@ -6743,7 +6709,7 @@ "version": "4.24.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "devOptional": true, + "dev": true, "funding": [ { "type": "opencollective", @@ -6786,6 +6752,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "dev": true, "license": "(MIT OR Apache-2.0)", "bin": { "btoa": "bin/btoa.js" @@ -6831,7 +6798,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/bytes": { @@ -6941,7 +6908,7 @@ "version": "1.0.30001707", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz", "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==", - "devOptional": true, + "dev": true, "funding": [ { "type": "opencollective", @@ -6995,7 +6962,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "engines": { @@ -7065,6 +7032,7 @@ "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz", "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==", "license": "MIT", + "peer": true, "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/commands": "^6.0.0", @@ -7086,6 +7054,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -7104,12 +7073,14 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -7122,6 +7093,7 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=16" @@ -7191,6 +7163,7 @@ "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" @@ -7203,6 +7176,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -7236,6 +7210,7 @@ "version": "0.9.1", "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", + "dev": true, "license": "MIT", "dependencies": { "depd": "~2.0.0", @@ -7317,12 +7292,14 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/cron-parser": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", + "dev": true, "license": "MIT", "dependencies": { "luxon": "^3.2.1" @@ -7403,7 +7380,8 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/damerau-levenshtein": { "version": "1.0.8", @@ -7496,6 +7474,7 @@ "resolved": "https://registry.npmjs.org/date-fns-tz/-/date-fns-tz-3.2.0.tgz", "integrity": "sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==", "license": "MIT", + "peer": true, "peerDependencies": { "date-fns": "^3.0.0 || ^4.0.0" } @@ -7504,6 +7483,7 @@ "version": "4.0.14", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true, "license": "MIT", "engines": { "node": ">=4.0" @@ -7578,6 +7558,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", + "dev": true, "license": "MIT" }, "node_modules/deep-is": { @@ -7658,6 +7639,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.4.0" @@ -7667,12 +7649,14 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true, "license": "MIT" }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -7692,6 +7676,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8", @@ -7752,6 +7737,7 @@ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" @@ -7799,6 +7785,7 @@ "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.5.0.tgz", "integrity": "sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "2.3.0", "zrender": "5.5.0" @@ -7808,19 +7795,21 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, "license": "MIT" }, "node_modules/electron-to-chromium": { "version": "1.5.123", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.123.tgz", "integrity": "sha512-refir3NlutEZqlKaBLK0tzlVLe5P2wDKS7UQt/3SpibizgsRAPOsqQC3ffw1nlv3ze5gjRQZYHoPymgVZkplFA==", - "devOptional": true, + "dev": true, "license": "ISC" }, "node_modules/emittery": { @@ -7847,6 +7836,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -7879,7 +7869,7 @@ "version": "5.18.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -8038,7 +8028,7 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true }, @@ -8058,6 +8048,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -8145,7 +8136,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "devOptional": true, + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -8155,6 +8146,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, "license": "MIT" }, "node_modules/escape-latex": { @@ -8717,7 +8709,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "devOptional": true, + "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" @@ -8730,7 +8722,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "devOptional": true, + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" @@ -8760,7 +8752,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "engines": { @@ -8804,6 +8796,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, "license": "MIT", "dependencies": { "homedir-polyfill": "^1.0.1" @@ -8921,6 +8914,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, "license": "MIT" }, "node_modules/fast-diff": { @@ -8930,12 +8924,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/fast-equals": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-4.0.3.tgz", - "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", - "license": "MIT" - }, "node_modules/fast-fifo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", @@ -8990,6 +8978,7 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, "funding": [ { "type": "github", @@ -9161,6 +9150,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-2.0.1.tgz", "integrity": "sha512-qVdaUhYO39zmh28/JLQM5CoYN9byEOKEH4qfa8K1eNV17W0UUMJ9WgbR/hHFH+t5rcl+6RTb5UC7ck/I+uRkpQ==", + "dev": true, "license": "MIT", "dependencies": { "resolve-dir": "^1.0.1" @@ -9173,6 +9163,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-2.0.0.tgz", "integrity": "sha512-WgZ+nKbELDa6N3i/9nrHeNznm+lY3z4YfhDDWgW+5P0pdmMj26bxaxU11ookgY3NyP9GC7HvZ9etp0jRFqGEeQ==", + "dev": true, "license": "MIT", "dependencies": { "find-file-up": "^2.0.1" @@ -9239,12 +9230,14 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.11", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, "funding": [ { "type": "individual", @@ -9281,6 +9274,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -9329,6 +9323,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -9338,6 +9333,7 @@ "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, "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", @@ -9353,6 +9349,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -9570,7 +9567,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "devOptional": true, + "dev": true, "license": "BSD-2-Clause", "peer": true }, @@ -9602,6 +9599,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, "license": "MIT", "dependencies": { "global-prefix": "^1.0.1", @@ -9616,6 +9614,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, "license": "MIT", "dependencies": { "expand-tilde": "^2.0.2", @@ -9632,6 +9631,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -9673,15 +9673,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/goober": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz", - "integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==", - "license": "MIT", - "peerDependencies": { - "csstype": "^3.0.10" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -9723,6 +9714,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, "license": "ISC" }, "node_modules/graphemer": { @@ -9749,6 +9741,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -9799,6 +9792,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -9843,6 +9837,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, "license": "MIT", "dependencies": { "parse-passwd": "^1.0.0" @@ -9892,6 +9887,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "dev": true, "license": "MIT", "dependencies": { "deep-equal": "~1.0.1", @@ -9905,6 +9901,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -9914,6 +9911,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, "license": "MIT", "dependencies": { "depd": "~1.1.2", @@ -9930,6 +9928,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -9945,6 +9944,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, "license": "MIT", "dependencies": { "depd": "2.0.0", @@ -10056,6 +10056,7 @@ "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -10133,12 +10134,14 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, "license": "ISC" }, "node_modules/inspect-with-kind": { @@ -10621,6 +10624,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -10637,12 +10641,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, "license": "ISC" }, "node_modules/isomorphic-ws": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "dev": true, "license": "MIT", "peerDependencies": { "ws": "*" @@ -11807,6 +11813,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "license": "MIT", "dependencies": { "universalify": "^2.0.0" @@ -11819,6 +11826,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 10.0.0" @@ -11845,6 +11853,7 @@ "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, "license": "MIT", "dependencies": { "tsscmp": "1.0.6" @@ -11886,6 +11895,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/koa/-/koa-3.0.3.tgz", "integrity": "sha512-MeuwbCoN1daWS32/Ni5qkzmrOtQO2qrnfdxDHjrm6s4b59yG4nexAJ0pTEFyzjLp0pBVO80CZp0vW8Ze30Ebow==", + "dev": true, "license": "MIT", "dependencies": { "accepts": "^1.3.8", @@ -11915,12 +11925,14 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", + "dev": true, "license": "MIT" }, "node_modules/koa/node_modules/media-typer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -11930,6 +11942,7 @@ "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -11939,6 +11952,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, "license": "MIT", "dependencies": { "mime-db": "^1.54.0" @@ -11955,6 +11969,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, "license": "MIT", "dependencies": { "content-type": "^1.0.5", @@ -12019,7 +12034,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "engines": { @@ -12052,6 +12067,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeepwith/-/lodash.clonedeepwith-4.5.0.tgz", "integrity": "sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==", + "dev": true, "license": "MIT" }, "node_modules/lodash.merge": { @@ -12065,6 +12081,7 @@ "version": "6.9.1", "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, "license": "Apache-2.0", "dependencies": { "date-format": "^4.0.14", @@ -12081,6 +12098,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/long-timeout/-/long-timeout-0.1.1.tgz", "integrity": "sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==", + "dev": true, "license": "MIT" }, "node_modules/loose-envify": { @@ -12121,6 +12139,7 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -12217,6 +12236,7 @@ "version": "7.9.3", "resolved": "https://registry.npmjs.org/mdi-material-ui/-/mdi-material-ui-7.9.3.tgz", "integrity": "sha512-l56RUX0tnxY+U1z6hE3cHKXwGUIGpHJLiW2papfvTB1qTegpn3iYU6sX+XBPtl+KG7Ww2RqCLAT03CNzOqeoIg==", + "dev": true, "license": "MIT", "peerDependencies": { "@mui/material": "^5.0.0 || ^6.0.0", @@ -12247,7 +12267,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/merge2": { @@ -12301,6 +12321,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -12310,6 +12331,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -12393,6 +12415,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" @@ -12402,7 +12425,7 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true }, @@ -12463,13 +12486,14 @@ "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/node-schedule": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/node-schedule/-/node-schedule-2.1.1.tgz", "integrity": "sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==", + "dev": true, "license": "MIT", "dependencies": { "cron-parser": "^4.2.0", @@ -12502,37 +12526,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/notistack": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/notistack/-/notistack-3.0.2.tgz", - "integrity": "sha512-0R+/arLYbK5Hh7mEfR2adt0tyXJcCC9KkA2hc56FeWik2QN6Bm/S4uW+BjzDARsJth5u06nTjelSw/VSnB1YEA==", - "license": "MIT", - "dependencies": { - "clsx": "^1.1.0", - "goober": "^2.0.33" - }, - "engines": { - "node": ">=12.0.0", - "npm": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/notistack" - }, - "peerDependencies": { - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/notistack/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -12690,6 +12683,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -12845,6 +12839,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -12867,6 +12862,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -13178,6 +13174,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, "license": "MIT" }, "node_modules/psl": { @@ -13274,23 +13271,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/raf-schd": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", - "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", - "license": "MIT" - }, "node_modules/rambda": { "version": "9.4.2", "resolved": "https://registry.npmjs.org/rambda/-/rambda-9.4.2.tgz", "integrity": "sha512-++euMfxnl7OgaEKwXh9QqThOjMeta2HH001N1v4mYQzBjJBnmXBh2BCK6dZAbICFVXOFUVD3xFG0R3ZPU0mxXw==", + "dev": true, "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -13364,16 +13356,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-colorful": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", - "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -13388,68 +13370,12 @@ "react": "^18.3.1" } }, - "node_modules/react-draggable": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.6.tgz", - "integrity": "sha512-LtY5Xw1zTPqHkVmtM3X8MUOxNDOUhv/khTgBgrUvwaS064bwVvxT+q5El0uUFNx5IEPKXuRejr7UqLwBIg5pdw==", - "license": "MIT", - "dependencies": { - "clsx": "^1.1.1", - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "react": ">= 16.3.0", - "react-dom": ">= 16.3.0" - } - }, - "node_modules/react-draggable/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/react-error-boundary": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", - "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "react": ">=16.13.1" - } - }, - "node_modules/react-grid-layout": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/react-grid-layout/-/react-grid-layout-1.5.1.tgz", - "integrity": "sha512-4Fr+kKMk0+m1HL/BWfHxi/lRuaOmDNNKQDcu7m12+NEYcen20wIuZFo789u3qWCyvUsNUxCiyf0eKq4WiJSNYw==", - "license": "MIT", - "dependencies": { - "clsx": "^2.0.0", - "fast-equals": "^4.0.3", - "prop-types": "^15.8.1", - "react-draggable": "^4.4.5", - "react-resizable": "^3.0.5", - "resize-observer-polyfill": "^1.5.1" - }, - "peerDependencies": { - "react": ">= 16.3.0", - "react-dom": ">= 16.3.0" - } - }, "node_modules/react-hook-form": { "version": "7.54.2", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.54.2.tgz", "integrity": "sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==", "license": "MIT", + "peer": true, "engines": { "node": ">=18.0.0" }, @@ -13461,21 +13387,6 @@ "react": "^16.8.0 || ^17 || ^18 || ^19" } }, - "node_modules/react-intersection-observer": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.16.0.tgz", - "integrity": "sha512-w9nJSEp+DrW9KmQmeWHQyfaP6b03v+TdXynaoA964Wxt7mdR3An11z4NNCQgL4gKSK7y1ver2Fq+JKH6CWEzUA==", - "license": "MIT", - "peerDependencies": { - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -13493,19 +13404,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-resizable": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/react-resizable/-/react-resizable-3.0.5.tgz", - "integrity": "sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w==", - "license": "MIT", - "dependencies": { - "prop-types": "15.x", - "react-draggable": "^4.0.3" - }, - "peerDependencies": { - "react": ">= 16.3" - } - }, "node_modules/react-router": { "version": "6.30.3", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", @@ -13524,6 +13422,7 @@ "version": "6.30.3", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", + "license": "MIT", "dependencies": { "@remix-run/router": "1.23.2", "react-router": "6.30.3" @@ -13541,6 +13440,7 @@ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", @@ -13640,6 +13540,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -13658,12 +13559,6 @@ "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", "license": "MIT" }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", - "license": "MIT" - }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -13717,6 +13612,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, "license": "MIT", "dependencies": { "expand-tilde": "^2.0.0", @@ -13785,6 +13681,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, "license": "MIT" }, "node_modules/rimraf": { @@ -13891,6 +13788,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -13976,6 +13874,7 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", @@ -13995,6 +13894,7 @@ "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -14011,6 +13911,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" @@ -14023,6 +13924,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, "license": "MIT" }, "node_modules/seedrandom": { @@ -14149,19 +14051,13 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "devOptional": true, + "dev": true, "license": "BSD-3-Clause", "peer": true, "dependencies": { "randombytes": "^2.1.0" } }, - "node_modules/serialize-query-params": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/serialize-query-params/-/serialize-query-params-2.0.2.tgz", - "integrity": "sha512-1chMo1dST4pFA9RDXAtF0Rbjaut4is7bzFbI1Z26IuMub68pNCILku85aYmeFhvnY//BXUPUhoRMjYcsT93J/Q==", - "license": "ISC" - }, "node_modules/serve-static": { "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", @@ -14231,6 +14127,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, "license": "ISC" }, "node_modules/shebang-command": { @@ -14392,13 +14289,14 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.3.0.tgz", "integrity": "sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==", + "dev": true, "license": "MIT" }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -14456,6 +14354,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -14465,6 +14364,7 @@ "version": "3.1.5", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dev": true, "license": "MIT", "dependencies": { "date-format": "^4.0.14", @@ -14479,6 +14379,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", @@ -14493,6 +14394,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -14502,6 +14404,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 4.0.0" @@ -14772,6 +14675,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^4.0.0" @@ -14820,7 +14724,7 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "engines": { @@ -14842,7 +14746,7 @@ "version": "5.43.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", - "devOptional": true, + "dev": true, "license": "BSD-2-Clause", "peer": true, "dependencies": { @@ -14862,7 +14766,7 @@ "version": "5.3.14", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -14898,7 +14802,7 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -14914,7 +14818,7 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -14931,7 +14835,7 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true }, @@ -14939,7 +14843,7 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -15086,6 +14990,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.6" @@ -15243,13 +15148,14 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "devOptional": true, + "dev": true, "license": "0BSD" }, "node_modules/tsscmp": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.6.x" @@ -15517,6 +15423,7 @@ "version": "5.8.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -15571,7 +15478,7 @@ "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "devOptional": true, + "dev": true, "license": "MIT" }, "node_modules/universalify": { @@ -15598,6 +15505,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "dev": true, "license": "MIT", "engines": { "node": ">=4", @@ -15608,7 +15516,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "devOptional": true, + "dev": true, "funding": [ { "type": "opencollective", @@ -15656,44 +15564,12 @@ "requires-port": "^1.0.0" } }, - "node_modules/use-immer": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/use-immer/-/use-immer-0.11.0.tgz", - "integrity": "sha512-RNAqi3GqsWJ4bcCd4LMBgdzvPmTABam24DUaFiKfX9s3MSorNRz9RDZYJkllJoMHUxVLMDetwAuCDeyWNrp1yA==", - "license": "MIT", - "peerDependencies": { - "immer": ">=8.0.0", - "react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/use-query-params": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/use-query-params/-/use-query-params-2.2.1.tgz", - "integrity": "sha512-i6alcyLB8w9i3ZK3caNftdb+UnbfBRNPDnc89CNQWkGRmDrm/gfydHvMBfVsQJRq3NoHOM2dt/ceBWG2397v1Q==", - "license": "ISC", - "dependencies": { - "serialize-query-params": "^2.0.2" - }, - "peerDependencies": { - "@reach/router": "^1.2.1", - "react": ">=16.8.0", - "react-dom": ">=16.8.0", - "react-router-dom": ">=5" - }, - "peerDependenciesMeta": { - "@reach/router": { - "optional": true - }, - "react-router-dom": { - "optional": true - } - } - }, "node_modules/use-resize-observer": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/use-resize-observer/-/use-resize-observer-9.1.0.tgz", "integrity": "sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==", "license": "MIT", + "peer": true, "dependencies": { "@juggle/resize-observer": "^3.3.1" }, @@ -15747,6 +15623,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.8" @@ -15785,7 +15662,7 @@ "version": "2.4.4", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -15810,7 +15687,7 @@ "version": "5.101.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.0.tgz", "integrity": "sha512-B4t+nJqytPeuZlHuIKTbalhljIFXeNRqrUGAQgTGlfOl2lXXKXw+yZu6bicycP+PUlM44CxBjCFD6aciKFT3LQ==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "dependencies": { @@ -15860,7 +15737,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", - "devOptional": true, + "dev": true, "license": "MIT", "peer": true, "engines": { @@ -15871,7 +15748,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "devOptional": true, + "dev": true, "license": "BSD-2-Clause", "peer": true, "dependencies": { @@ -15886,7 +15763,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "devOptional": true, + "dev": true, "license": "BSD-2-Clause", "peer": true, "engines": { @@ -16101,6 +15978,7 @@ "version": "8.18.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" @@ -16152,18 +16030,6 @@ "dev": true, "license": "ISC" }, - "node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -16243,6 +16109,7 @@ "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.5.0.tgz", "integrity": "sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "tslib": "2.3.0" } @@ -16251,35 +16118,8 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "license": "0BSD" - }, - "node_modules/zustand": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.6.tgz", - "integrity": "sha512-ibr/n1hBzLLj5Y+yUcU7dYw8p6WnIVzdJbnX+1YpaScvZVF2ziugqHs+LAmHw4lWO9c/zRj+K1ncgWDQuthEdQ==", - "license": "MIT", - "dependencies": { - "use-sync-external-store": "^1.2.2" - }, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "@types/react": ">=16.8", - "immer": ">=9.0.6", - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - } - } + "license": "0BSD", + "peer": true }, "piechart": { "name": "@perses-dev/pie-chart-plugin", diff --git a/package.json b/package.json index 30a59cea..4e4d2abd 100644 --- a/package.json +++ b/package.json @@ -43,11 +43,11 @@ }, "devDependencies": { "@module-federation/rsbuild-plugin": "^0.21.6", - "@perses-dev/components": "^0.53.0-rc.1", + "@perses-dev/components": "file:../shared/components", "@perses-dev/core": "^0.53.0-beta.4", - "@perses-dev/dashboards": "^0.53.0-rc.1", - "@perses-dev/explore": "^0.53.0-rc.1", - "@perses-dev/plugin-system": "^0.53.0-rc.1", + "@perses-dev/dashboards": "file:../shared/dashboards", + "@perses-dev/explore": "file:../shared/explore", + "@perses-dev/plugin-system": "file:../shared/plugin-system", "@rsbuild/core": "^1.6.7", "@rsbuild/plugin-react": "^1.4.2", "@swc/cli": "^0.7.9", @@ -84,4 +84,4 @@ "typescript": "^5.4.2" }, "packageManager": "npm@10.9.2" -} \ No newline at end of file +} diff --git a/pyroscope/src/plugins/pyroscope-profile-query/PyroscopeProfileQuery.ts b/pyroscope/src/plugins/pyroscope-profile-query/PyroscopeProfileQuery.ts index 61a3228e..0d385190 100644 --- a/pyroscope/src/plugins/pyroscope-profile-query/PyroscopeProfileQuery.ts +++ b/pyroscope/src/plugins/pyroscope-profile-query/PyroscopeProfileQuery.ts @@ -15,7 +15,17 @@ import { LabelFilter } from '../../utils/types'; import { getProfileData } from './get-profile-data'; import { PyroscopeProfileQueryEditor } from './PyroscopeProfileQueryEditor'; -export const PyroscopeProfileQuery = { +export const PyroscopeProfileQuery: { + getProfileData: typeof getProfileData; + OptionsEditorComponent: typeof PyroscopeProfileQueryEditor; + createInitialOptions: () => { + maxNodes: number; + datasource?: string; + service: string; + profileType: string; + filters: LabelFilter[]; + }; +} = { getProfileData, OptionsEditorComponent: PyroscopeProfileQueryEditor, createInitialOptions: (): { diff --git a/table/schemas/table.cue b/table/schemas/table.cue index 4632668e..dd33a2d8 100644 --- a/table/schemas/table.cue +++ b/table/schemas/table.cue @@ -16,6 +16,7 @@ package model import ( "strings" "github.com/perses/shared/cue/common" + commLocal "github.com/perses/local/cue/common" model "github.com/perses/perses/cue/model/api/v1/common" ) @@ -26,10 +27,12 @@ spec: close({ defaultColumnHeight?: "auto" | number defaultColumnHidden?: bool pagination?: bool - enableFiltering?: bool - columnSettings?: [...#columnSettings] - cellSettings?: [...#cellSettings] - transforms?: [...common.#transform] + enableFiltering?: bool + selection?: commLocal.#selection + actions?: commLocal.#actions + columnSettings?: [...#columnSettings] + cellSettings?: [...#cellSettings] + transforms?: [...common.#transform] }) #columnSettings: { diff --git a/table/src/Table.ts b/table/src/Table.ts index 1a135446..d27828d5 100644 --- a/table/src/Table.ts +++ b/table/src/Table.ts @@ -12,16 +12,17 @@ // limitations under the License. import { PanelPlugin } from '@perses-dev/plugin-system'; -import { createInitialTableOptions, TableOptions } from './models'; import { getTablePanelQueryOptions, + TableCellsEditor, + TableColumnsEditor, TablePanel, TableProps, - TableColumnsEditor, TableSettingsEditor, - TableCellsEditor, TableTransformsEditor, } from './components'; +import { TableItemSelectionActionsEditor } from './components/TableItemSelectionActionsEditor'; +import { createInitialTableOptions, TableOptions } from './models'; /** * The core TimeSeriesTable panel plugin for Perses. @@ -35,6 +36,7 @@ export const Table: PanelPlugin = { { label: 'Column Settings', content: TableColumnsEditor }, { label: 'Cell Settings', content: TableCellsEditor }, { label: 'Transforms', content: TableTransformsEditor }, + { label: 'Item Actions', content: TableItemSelectionActionsEditor }, ], createInitialOptions: createInitialTableOptions, }; diff --git a/table/src/components/TableItemSelectionActionsEditor.tsx b/table/src/components/TableItemSelectionActionsEditor.tsx new file mode 100644 index 00000000..088bf62b --- /dev/null +++ b/table/src/components/TableItemSelectionActionsEditor.tsx @@ -0,0 +1,35 @@ +// Copyright The Perses Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { ActionOptions, ItemSelectionActionsEditor, SelectionOptions } from '@perses-dev/plugin-system'; +import { ReactElement } from 'react'; +import { TableSettingsEditorProps } from '../models'; + +export function TableItemSelectionActionsEditor({ value, onChange }: TableSettingsEditorProps): ReactElement { + function handleActionsChange(actions: ActionOptions | undefined): void { + onChange({ ...value, actions: actions }); + } + + function handleSelectionChange(selection: SelectionOptions | undefined): void { + onChange({ ...value, selection: selection }); + } + + return ( + + ); +} diff --git a/table/src/components/TablePanel.tsx b/table/src/components/TablePanel.tsx index 4d8b5b64..1a95fd8f 100644 --- a/table/src/components/TablePanel.tsx +++ b/table/src/components/TablePanel.tsx @@ -11,19 +11,21 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { Box, Theme, Typography, useTheme } from '@mui/material'; +import { Table, TableCellConfigs, TableColumnConfig, useSelection } from '@perses-dev/components'; +import { formatValue, Labels, QueryDataType, TimeSeries, TimeSeriesData, transformData } from '@perses-dev/core'; +import { useSelectionItemActions } from '@perses-dev/dashboards'; import { + ActionsOptions, PanelData, PanelProps, replaceVariablesInString, useAllVariableValues, VariableStateMap, } from '@perses-dev/plugin-system'; -import { Table, TableCellConfigs, TableColumnConfig } from '@perses-dev/components'; -import { ReactElement, useEffect, useMemo, useState } from 'react'; -import { formatValue, Labels, QueryDataType, TimeSeries, TimeSeriesData, transformData } from '@perses-dev/core'; -import { PaginationState, SortingState, ColumnFiltersState } from '@tanstack/react-table'; -import { useTheme, Theme, Typography, Box } from '@mui/material'; -import { ColumnSettings, TableOptions, evaluateConditionalFormatting } from '../models'; +import { ColumnFiltersState, PaginationState, RowSelectionState, SortingState } from '@tanstack/react-table'; +import { ReactElement, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { ColumnSettings, evaluateConditionalFormatting, TableOptions } from '../models'; import { EmbeddedPanel } from './EmbeddedPanel'; function generateCellContentConfig( @@ -211,6 +213,50 @@ export function TablePanel({ contentDimensions, spec, queryResults }: TableProps const theme = useTheme(); const allVariables = useAllVariableValues(); + const selectionEnabled = spec.selection?.enabled ?? false; + const { selectionMap, setSelection, clearSelection } = useSelection, string>(); + + const itemActionsConfig = spec.actions ? (spec.actions as ActionsOptions) : undefined; + const itemActionsListConfig = + itemActionsConfig?.enabled && itemActionsConfig.displayWithItem ? itemActionsConfig.actionsList : []; + + const { getItemActionButtons, confirmDialog, actionButtons } = useSelectionItemActions({ + actions: itemActionsListConfig, + variableState: allVariables, + }); + + const filteredDataRef = useRef>>([]); + + // Convert selectionMap to TanStack's RowSelectionState format + const rowSelection = useMemo((): RowSelectionState => { + const result: RowSelectionState = {}; + selectionMap.forEach((_, id) => { + result[id as string] = true; + }); + return result; + }, [selectionMap]); + + const handleRowSelectionChange = useCallback( + (newRowSelection: RowSelectionState) => { + const newSelection: Array<{ id: string; item: Record }> = []; + for (const [id, isSelected] of Object.entries(newRowSelection)) { + if (isSelected) { + const index = parseInt(id, 10); + if (filteredDataRef.current[index] !== undefined) { + newSelection.push({ id, item: filteredDataRef.current[index] }); + } + } + } + + if (newSelection.length === 0) { + clearSelection(); + } else { + setSelection(newSelection); + } + }, + [setSelection, clearSelection] + ); + // TODO: handle other query types const queryMode = getTablePanelQueryOptions(spec).mode; const rawData: Array> = useMemo(() => { @@ -452,6 +498,9 @@ export function TablePanel({ contentDimensions, spec, queryResults }: TableProps return filtered; }, [data, columnFilters, spec.enableFiltering]); + // Keep ref in sync with filtered data for use in selection handler + filteredDataRef.current = filteredData; + const [pagination, setPagination] = useState( spec.pagination ? { pageIndex: 0, pageSize: 10 } : undefined ); @@ -486,6 +535,7 @@ export function TablePanel({ contentDimensions, spec, queryResults }: TableProps return ( <> + {confirmDialog} {spec.enableFiltering && (
getItemActionButtons({ id, data: data as Record })} + hasItemActions={actionButtons && actionButtons.length > 0} /> ); diff --git a/table/src/components/index.ts b/table/src/components/index.ts index 51f220c0..ab35f408 100644 --- a/table/src/components/index.ts +++ b/table/src/components/index.ts @@ -16,6 +16,7 @@ export * from './ColumnsEditor'; export * from './EmbeddedPanel'; export * from './TableCellsEditor'; export * from './TableColumnsEditor'; +export * from './TableItemSelectionActionsEditor'; export * from './TablePanel'; export * from './TableSettingsEditor'; export * from './TableTransformsEditor'; diff --git a/table/src/models/table-model.ts b/table/src/models/table-model.ts index a8f32a21..6c610ca8 100644 --- a/table/src/models/table-model.ts +++ b/table/src/models/table-model.ts @@ -13,7 +13,7 @@ import { Definition, FormatOptions, Transform, UnknownSpec } from '@perses-dev/core'; import { TableDensity, TableCellConfig } from '@perses-dev/components'; -import { OptionsEditorProps } from '@perses-dev/plugin-system'; +import { ActionOptions, OptionsEditorProps, SelectionOptions } from '@perses-dev/plugin-system'; import React from 'react'; import { TextField, Stack, MenuItem, Typography } from '@mui/material'; @@ -138,6 +138,10 @@ export interface TableOptions { pagination?: boolean; // Enable filtering for individual columns. enableFiltering?: boolean; + // Enable row selection. + selection?: SelectionOptions; + // Customize actions available for selected rows. + actions?: ActionOptions; // Customize column display and order them by their index in the array. columnSettings?: ColumnSettings[]; // Customize cell display based on their value. diff --git a/timeseriestable/cue.mod/module.cue b/timeseriestable/cue.mod/module.cue index 2d00ce16..8406f822 100644 --- a/timeseriestable/cue.mod/module.cue +++ b/timeseriestable/cue.mod/module.cue @@ -5,3 +5,14 @@ language: { source: { kind: "git" } +deps: { + "github.com/perses/perses/cue@v0": { + v: "v0.53.0-rc.0" + default: true + } + "github.com/perses/shared/cue@v0": { + v: "v0.53.0-rc.1" + default: true + } +} + diff --git a/timeseriestable/schemas/time-series-table.cue b/timeseriestable/schemas/time-series-table.cue index 02e0df45..19142956 100644 --- a/timeseriestable/schemas/time-series-table.cue +++ b/timeseriestable/schemas/time-series-table.cue @@ -13,5 +13,12 @@ package model +import ( + "github.com/perses/shared/cue/common" +) + kind: "TimeSeriesTable" -spec: close({}) +spec: close({ + selection?: common.#selection + actions?: common.#actions +}) diff --git a/timeseriestable/src/TimeSeriesTable.ts b/timeseriestable/src/TimeSeriesTable.ts index 0738b601..b08836aa 100644 --- a/timeseriestable/src/TimeSeriesTable.ts +++ b/timeseriestable/src/TimeSeriesTable.ts @@ -13,6 +13,7 @@ import { PanelPlugin } from '@perses-dev/plugin-system'; import { TimeSeriesTablePanel, TimeSeriesTableProps } from './TimeSeriesTablePanel'; +import { TimeSeriesTableItemSelectionActionsEditor } from './components'; import { TimeSeriesTableOptions } from './model'; /** @@ -24,6 +25,7 @@ export const TimeSeriesTable: PanelPlugin { return {}; }, diff --git a/timeseriestable/src/TimeSeriesTablePanel.test.tsx b/timeseriestable/src/TimeSeriesTablePanel.test.tsx index 5876921a..754d9e53 100644 --- a/timeseriestable/src/TimeSeriesTablePanel.test.tsx +++ b/timeseriestable/src/TimeSeriesTablePanel.test.tsx @@ -11,8 +11,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { ChartsProvider, SnackbarProvider, testChartsTheme } from '@perses-dev/components'; +import { ChartsProvider, SelectionProvider, SnackbarProvider, testChartsTheme } from '@perses-dev/components'; import { TimeSeriesData } from '@perses-dev/core'; +import userEvent from '@testing-library/user-event'; import { render, screen } from '@testing-library/react'; import { MOCK_TIME_SERIES_DATA_MULTIVALUE, @@ -20,6 +21,7 @@ import { MOCK_TIME_SERIES_QUERY_DEFINITION, } from './test/mock-query-results'; import { TimeSeriesTablePanel, TimeSeriesTableProps } from './TimeSeriesTablePanel'; +import { TimeSeriesTableOptions } from './model'; const TEST_TIME_SERIES_TABLE_PROPS: Omit = { contentDimensions: { @@ -31,15 +33,18 @@ const TEST_TIME_SERIES_TABLE_PROPS: Omit = describe('TimeSeriesTablePanel', () => { // Helper to render the panel with some context set - const renderPanel = (data: TimeSeriesData): void => { + const renderPanel = (data: TimeSeriesData, options?: TimeSeriesTableOptions): void => { render( - - - + + + + + ); }; @@ -74,4 +79,144 @@ describe('TimeSeriesTablePanel', () => { expect(await screen.findAllByRole('cell')).toHaveLength(4); // 2 lines with 2 column expect(screen.queryByText('@')).toBeNull(); // No @ as no timestamp }); + + describe('Selection', () => { + it('should not render checkboxes when selection is disabled', async () => { + renderPanel(MOCK_TIME_SERIES_DATA_SINGLEVALUE, { selection: { enabled: false } }); + + expect(screen.queryAllByRole('checkbox')).toHaveLength(0); + }); + + it('should render checkboxes when selection is enabled', async () => { + renderPanel(MOCK_TIME_SERIES_DATA_SINGLEVALUE, { selection: { enabled: true } }); + + // Should have select-all checkbox + 2 row checkboxes + const checkboxes = await screen.findAllByRole('checkbox'); + expect(checkboxes).toHaveLength(3); // 1 header checkbox + 2 row checkboxes + }); + + it('should render table header with column labels when selection is enabled', async () => { + renderPanel(MOCK_TIME_SERIES_DATA_SINGLEVALUE, { selection: { enabled: true } }); + + expect(await screen.findByRole('columnheader', { name: /Series/i })).toBeInTheDocument(); + expect(await screen.findByRole('columnheader', { name: /Value/i })).toBeInTheDocument(); + }); + + it('should toggle row selection when clicking checkbox', async () => { + renderPanel(MOCK_TIME_SERIES_DATA_SINGLEVALUE, { selection: { enabled: true } }); + + const checkboxes = await screen.findAllByRole('checkbox'); + const rowCheckbox = checkboxes[1]!; // First row checkbox (index 0 is select-all) + + // Initially unchecked + expect(rowCheckbox).not.toBeChecked(); + + // Click to select + userEvent.click(rowCheckbox); + expect(rowCheckbox).toBeChecked(); + + // Click again to deselect + userEvent.click(rowCheckbox); + expect(rowCheckbox).not.toBeChecked(); + }); + + it('should select all rows when clicking header checkbox', async () => { + renderPanel(MOCK_TIME_SERIES_DATA_SINGLEVALUE, { selection: { enabled: true } }); + + const checkboxes = await screen.findAllByRole('checkbox'); + const selectAllCheckbox = checkboxes[0]!; + const rowCheckbox1 = checkboxes[1]!; + const rowCheckbox2 = checkboxes[2]!; + + // Initially all unchecked + expect(selectAllCheckbox).not.toBeChecked(); + expect(rowCheckbox1).not.toBeChecked(); + expect(rowCheckbox2).not.toBeChecked(); + + // Click select-all + await userEvent.click(selectAllCheckbox); + + // All should be checked + expect(selectAllCheckbox).toBeChecked(); + expect(rowCheckbox1).toBeChecked(); + expect(rowCheckbox2).toBeChecked(); + }); + + it('should deselect all rows when clicking header checkbox while all selected', async () => { + renderPanel(MOCK_TIME_SERIES_DATA_SINGLEVALUE, { selection: { enabled: true } }); + + const checkboxes = await screen.findAllByRole('checkbox'); + const selectAllCheckbox = checkboxes[0]!; + + // Select all + userEvent.click(selectAllCheckbox); + expect(selectAllCheckbox).toBeChecked(); + + // Deselect all + userEvent.click(selectAllCheckbox); + expect(selectAllCheckbox).not.toBeChecked(); + + // All row checkboxes should be unchecked + const updatedCheckboxes = await screen.findAllByRole('checkbox'); + expect(updatedCheckboxes[1]).not.toBeChecked(); + expect(updatedCheckboxes[2]).not.toBeChecked(); + }); + }); + + describe('Item Actions', () => { + it('should not render actions column when actions are disabled', async () => { + renderPanel(MOCK_TIME_SERIES_DATA_SINGLEVALUE, { + selection: { enabled: true }, + actions: { enabled: false }, + }); + + expect(screen.queryByRole('columnheader', { name: /Actions/i })).not.toBeInTheDocument(); + }); + + it('should render actions column when actions are enabled with displayWithItem', async () => { + renderPanel(MOCK_TIME_SERIES_DATA_SINGLEVALUE, { + selection: { enabled: true }, + actions: { + enabled: true, + displayWithItem: true, + actionsList: [ + { + type: 'webhook', + name: 'Test Action', + url: 'https://example.com/action', + method: 'POST', + contentType: 'json', + batchMode: 'individual', + }, + ], + }, + }); + + expect(await screen.findByRole('columnheader', { name: /Actions/i })).toBeInTheDocument(); + }); + + it('should render action buttons for each row', async () => { + renderPanel(MOCK_TIME_SERIES_DATA_SINGLEVALUE, { + selection: { enabled: true }, + actions: { + enabled: true, + displayWithItem: true, + actionsList: [ + { + type: 'webhook', + name: 'My Test Action', + url: 'https://example.com/action', + method: 'POST', + contentType: 'json', + batchMode: 'individual', + }, + ], + }, + }); + + // Should have action buttons for each of the 2 rows + const actionButtons = await screen.findAllByRole('button', { name: /My Test Action/i }); + expect(actionButtons).toHaveLength(2); + }); + }); }); diff --git a/timeseriestable/src/TimeSeriesTablePanel.tsx b/timeseriestable/src/TimeSeriesTablePanel.tsx index af50a1b7..d8531526 100644 --- a/timeseriestable/src/TimeSeriesTablePanel.tsx +++ b/timeseriestable/src/TimeSeriesTablePanel.tsx @@ -23,7 +23,7 @@ import { DataTable } from './components'; export type TimeSeriesTableProps = PanelProps; export function TimeSeriesTablePanel(props: TimeSeriesTableProps): ReactElement { - const { contentDimensions, queryResults } = props; + const { contentDimensions, queryResults, spec } = props; const chartsTheme = useChartsTheme(); const contentPadding = chartsTheme.container.padding.default; @@ -32,7 +32,7 @@ export function TimeSeriesTablePanel(props: TimeSeriesTableProps): ReactElement style={{ height: contentDimensions?.height ?? 0 }} sx={{ padding: `${contentPadding}px`, overflowY: 'scroll' }} > - + ); } diff --git a/timeseriestable/src/components/DataTable.tsx b/timeseriestable/src/components/DataTable.tsx index 8f7da4b7..0471034f 100644 --- a/timeseriestable/src/components/DataTable.tsx +++ b/timeseriestable/src/components/DataTable.tsx @@ -11,10 +11,24 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { ReactElement, ReactNode, useMemo } from 'react'; -import { Alert, Box, Stack, Table, TableBody, TableCell, TableHead, TableRow, Typography } from '@mui/material'; +import { ReactElement, ReactNode, useMemo, useCallback } from 'react'; +import { + Alert, + Box, + Checkbox, + Stack, + Table, + TableBody, + TableCell, + TableHead, + TableRow, + Typography, +} from '@mui/material'; import { TimeSeries, TimeSeriesData, BucketTuple, TimeSeriesHistogramTuple, HistogramValue } from '@perses-dev/core'; -import { PanelData } from '@perses-dev/plugin-system'; +import { ActionsOptions, PanelData, useAllVariableValues } from '@perses-dev/plugin-system'; +import { useSelection } from '@perses-dev/components'; +import { useSelectionItemActions } from '@perses-dev/dashboards'; +import { TimeSeriesTableOptions } from '../model'; import { SeriesName } from './SeriesName'; import { EmbeddedPanel } from './EmbeddedPanel'; @@ -22,6 +36,20 @@ const MAX_FORMATTABLE_SERIES = 1000; export interface DataTableProps { queryResults: Array>; + spec: TimeSeriesTableOptions; +} + +/** + * Build row data object from a TimeSeries, including all labels and value + */ +function buildRowData(ts: TimeSeries): Record { + return { + ...ts.labels, + name: ts.name, + formattedName: ts.formattedName, + value: ts.values?.[0]?.[1], + timestamp: ts.values?.[0]?.[0], + }; } /** @@ -32,11 +60,71 @@ export interface DataTableProps { * @param result timeseries query result * @constructor */ -export const DataTable = ({ queryResults }: DataTableProps): ReactElement | null => { +export const DataTable = ({ queryResults, spec }: DataTableProps): ReactElement | null => { + const allVariables = useAllVariableValues(); const series = useMemo(() => queryResults.flatMap((d) => d.data).flatMap((d) => d?.series || []), [queryResults]); - const rows = useMemo(() => buildRows(series, queryResults), [series, queryResults]); - if (!queryResults || !rows?.length) { + const selectionEnabled = spec.selection?.enabled ?? false; + const { selectionMap, setSelection, clearSelection, toggleSelection } = useSelection< + Record, + string + >(); + + const itemActionsConfig = spec.actions ? (spec.actions as ActionsOptions) : undefined; + const itemActionsListConfig = useMemo( + () => (itemActionsConfig?.enabled && itemActionsConfig.displayWithItem ? itemActionsConfig.actionsList : []), + [itemActionsConfig?.enabled, itemActionsConfig?.displayWithItem, itemActionsConfig?.actionsList] + ); + + const { getItemActionButtons, confirmDialog, actionButtons } = useSelectionItemActions({ + actions: itemActionsListConfig, + variableState: allVariables, + }); + + const hasItemActions = actionButtons && actionButtons.length > 0; + + const allSelected = useMemo(() => { + if (series.length === 0) return false; + return series.every((_, idx) => selectionMap.has(idx.toString())); + }, [series, selectionMap]); + + // Check if some (but not all) series are selected + const someSelected = useMemo(() => { + if (series.length === 0) return false; + const selectedCount = series.filter((_, idx) => selectionMap.has(idx.toString())).length; + return selectedCount > 0 && selectedCount < series.length; + }, [series, selectionMap]); + + const handleSelectAll = useCallback(() => { + if (allSelected) { + clearSelection(); + } else { + const allItems = series.map((ts, idx) => ({ + id: idx.toString(), + item: buildRowData(ts), + })); + setSelection(allItems); + } + }, [allSelected, series, setSelection, clearSelection]); + + const handleRowSelectionToggle = useCallback( + (ts: TimeSeries, seriesIdx: number) => { + const rowData = buildRowData(ts); + toggleSelection(rowData, seriesIdx.toString()); + }, + [toggleSelection] + ); + + // Memoize row data for stable references + const rowsData = useMemo(() => { + return series.map((ts, idx) => ({ + ts, + idx, + rowData: buildRowData(ts), + })); + }, [series]); + + if (!queryResults || !series?.length) { return ( + {confirmDialog} {series.length >= MAX_FORMATTABLE_SERIES && ( Showing more than {MAX_FORMATTABLE_SERIES} series, turning off label formatting for performance reasons. )} - {rows} + {selectionEnabled && series.length > 0 && ( + + + + + + {hasItemActions && Actions} + Series + Value + + + )} + + {rowsData.map(({ ts, idx, rowData }) => { + const displayTimeStamps = (ts.values?.length ?? 0) > 1; + const valuesAndTimes = ts.values + ? ts.values.map((v, valIdx) => ( + + {v[1]} {displayTimeStamps && @{v[0]}} + + )) + : []; + + let histogramsAndTimes = null; + if (ts.histograms && ts.histograms.length > 0) { + const seriesQueryResult: PanelData = { + ...queryResults[0]!, + data: { + ...queryResults[0]!.data, + series: [queryResults[0]!.data.series[idx]!], + }, + }; + + histogramsAndTimes = ts.histograms.map((h: TimeSeriesHistogramTuple, hisIdx: number) => ( + + + + + + Total count: {h[1].count} + Sum: {h[1].sum} + + {histogramTable(h[1])} + + )); + } + + const rowId = idx.toString(); + const isSelected = selectionMap.has(rowId); + const isFormatted = series.length < MAX_FORMATTABLE_SERIES; + + return ( + + {selectionEnabled && ( + + handleRowSelectionToggle(ts, idx)} + inputProps={{ 'aria-label': `select series ${idx}` }} + /> + + )} + {hasItemActions && ( + + {getItemActionButtons({ id: rowId, data: rowData })} + + )} + + + + {ts.histograms ? histogramsAndTimes : valuesAndTimes} + + ); + })} +
); }; -function buildRows(series: TimeSeries[], queryResults: Array>): ReactNode[] { - const isFormatted = series.length < MAX_FORMATTABLE_SERIES; // only format series names if we have less than 1000 series for performance reasons - return series.map((s, seriesIdx) => { - const displayTimeStamps = (s.values?.length ?? 0) > 1; - const valuesAndTimes = s.values - ? s.values.map((v, valIdx) => { - return ( - - {v[1]} {displayTimeStamps && @{v[0]}} - - ); - }) - : []; - - let histogramsAndTimes = null; - if (s.histograms && s.histograms.length > 0) { - // Query results contains multiple series, create a new query result with only the current series - const seriesQueryResult: PanelData = { - ...queryResults[0]!, - data: { - ...queryResults[0]!.data, - series: [queryResults[0]!.data.series[seriesIdx]!], - }, - }; - - histogramsAndTimes = s.histograms.map((h: TimeSeriesHistogramTuple, hisIdx: number) => { - return ( - - - - - - Total count: {h[1].count} - Sum: {h[1].sum} - - {histogramTable(h[1])} - - ); - }); - } - return ( - - - - - {s.histograms ? histogramsAndTimes : valuesAndTimes} - - ); - }); -} - const leftDelim = (br: number): string => (br === 3 || br === 1 ? '[' : '('); const rightDelim = (br: number): string => (br === 3 || br === 0 ? ']' : ')'); diff --git a/timeseriestable/src/components/TimeSeriesTableItemSelectionActionsEditor.tsx b/timeseriestable/src/components/TimeSeriesTableItemSelectionActionsEditor.tsx new file mode 100644 index 00000000..e8ca51f0 --- /dev/null +++ b/timeseriestable/src/components/TimeSeriesTableItemSelectionActionsEditor.tsx @@ -0,0 +1,38 @@ +// Copyright The Perses Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { ActionOptions, ItemSelectionActionsEditor, SelectionOptions } from '@perses-dev/plugin-system'; +import { ReactElement } from 'react'; +import { TimeSeriesTableSettingsEditorProps } from '../model'; + +export function TimeSeriesTableItemSelectionActionsEditor({ + value, + onChange, +}: TimeSeriesTableSettingsEditorProps): ReactElement { + function handleActionsChange(actions: ActionOptions | undefined): void { + onChange({ ...value, actions: actions }); + } + + function handleSelectionChange(selection: SelectionOptions | undefined): void { + onChange({ ...value, selection: selection }); + } + + return ( + + ); +} diff --git a/timeseriestable/src/components/index.ts b/timeseriestable/src/components/index.ts index 040329c8..5cd92774 100644 --- a/timeseriestable/src/components/index.ts +++ b/timeseriestable/src/components/index.ts @@ -13,3 +13,4 @@ export * from './DataTable'; export * from './SeriesName'; +export * from './TimeSeriesTableItemSelectionActionsEditor'; diff --git a/timeseriestable/src/model.ts b/timeseriestable/src/model.ts index af28a4ca..fef3e76a 100644 --- a/timeseriestable/src/model.ts +++ b/timeseriestable/src/model.ts @@ -11,5 +11,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -// eslint-disable-next-line @typescript-eslint/no-empty-object-type -export interface TimeSeriesTableOptions {} +import { ActionsOptions, OptionsEditorProps, SelectionOptions } from '@perses-dev/plugin-system'; + +export interface TimeSeriesTableOptions { + /** + * Enable row selection with checkboxes + */ + selection?: SelectionOptions; + /** + * Configure actions that can be executed on selected rows + */ + actions?: ActionsOptions; +} + +export type TimeSeriesTableSettingsEditorProps = OptionsEditorProps; diff --git a/tracetable/cue.mod/module.cue b/tracetable/cue.mod/module.cue index d076cb46..d9ae2686 100644 --- a/tracetable/cue.mod/module.cue +++ b/tracetable/cue.mod/module.cue @@ -5,3 +5,10 @@ language: { source: { kind: "git" } +deps: { + "github.com/perses/shared/cue@v0": { + v: "v0.53.0-rc.1" + default: true + } +} + diff --git a/tracetable/schemas/trace-table.cue b/tracetable/schemas/trace-table.cue index 9d022e3c..8bc02a44 100644 --- a/tracetable/schemas/trace-table.cue +++ b/tracetable/schemas/trace-table.cue @@ -13,6 +13,10 @@ package model +import ( + localComm "github.com/perses/local/cue/common" +) + #palette: { mode: "auto" | "categorical" } @@ -27,6 +31,8 @@ package model kind: "TraceTable" spec: close({ - visual?: #visual - links?: #links + visual?: #visual + links?: #links + selection?: localComm.#selection + actions?: localComm.#actions }) diff --git a/tracetable/src/DataTable.tsx b/tracetable/src/DataTable.tsx index f2418e31..69b3f20a 100644 --- a/tracetable/src/DataTable.tsx +++ b/tracetable/src/DataTable.tsx @@ -21,9 +21,10 @@ import { msToPrometheusDuration, } from '@perses-dev/core'; import { PanelData, replaceVariablesInString, useAllVariableValues, useRouterContext } from '@perses-dev/plugin-system'; +import { useSelectionItemActions } from '@perses-dev/dashboards'; import InformationIcon from 'mdi-material-ui/Information'; -import { useChartsTheme } from '@perses-dev/components'; -import { DataGrid, GridColDef } from '@mui/x-data-grid'; +import { useChartsTheme, useSelection } from '@perses-dev/components'; +import { DataGrid, GridColDef, GridRowSelectionModel } from '@mui/x-data-grid'; import { ReactElement, useCallback, useMemo } from 'react'; import { getServiceColor } from './utils/utils'; import { TraceTableOptions } from './trace-table-model'; @@ -55,30 +56,74 @@ export function DataTable(props: DataTableProps): ReactElement { const chartsTheme = useChartsTheme(); const variableValues = useAllVariableValues(); + const selectionEnabled = options.selection?.enabled ?? false; + const { selectionMap, setSelection, clearSelection } = useSelection(); + + const itemActionsConfig = options.actions; + const showItemActions = itemActionsConfig?.enabled && itemActionsConfig?.displayWithItem; + const actionsList = showItemActions ? itemActionsConfig.actionsList : undefined; + + const { getItemActionButtons, confirmDialog } = useSelectionItemActions({ + actions: actionsList, + variableState: variableValues, + }); + + // Convert selectionMap to DataGrid's row selection model + const rowSelectionModel = useMemo((): GridRowSelectionModel => { + return Array.from(selectionMap.keys()) as string[]; + }, [selectionMap]); + const paletteMode = options.visual?.palette?.mode; const serviceColorGenerator = useCallback( (serviceName: string) => getServiceColor(muiTheme, chartsTheme, paletteMode, serviceName), [muiTheme, chartsTheme, paletteMode] ); - const rows: Row[] = []; - for (const query of result) { - const pluginSpec = query.definition.spec.plugin.spec as { datasource?: { name?: string } } | undefined; - const datasourceName = pluginSpec?.datasource?.name; + const rows: Row[] = useMemo(() => { + const result_rows: Row[] = []; + for (const query of result) { + const pluginSpec = query.definition.spec.plugin.spec as { datasource?: { name?: string } } | undefined; + const datasourceName = pluginSpec?.datasource?.name; - for (const trace of query.data?.searchResult || []) { - const traceLink = options.links?.trace - ? replaceVariablesInString(options.links.trace, variableValues, { - datasourceName: datasourceName ?? '', - traceId: trace.traceId, - }) - : undefined; - rows.push({ - ...trace, - traceLink, - }); + for (const trace of query.data?.searchResult || []) { + const traceLink = options.links?.trace + ? replaceVariablesInString(options.links.trace, variableValues, { + datasourceName: datasourceName ?? '', + traceId: trace.traceId, + }) + : undefined; + result_rows.push({ + ...trace, + traceLink, + }); + } } - } + return result_rows; + }, [result, options.links?.trace, variableValues]); + + const rowsById = useMemo(() => { + const map = new Map(); + rows.forEach((row) => map.set(row.traceId, row)); + return map; + }, [rows]); + + const handleRowSelectionModelChange = useCallback( + (newSelectionModel: GridRowSelectionModel) => { + const selectedIds = newSelectionModel as string[]; + if (selectedIds.length === 0) { + clearSelection(); + } else { + const newSelection = selectedIds + .map((id) => { + const row = rowsById.get(id); + return row ? { id, item: row } : null; + }) + .filter((entry): entry is { id: string; item: Row } => entry !== null); + setSelection(newSelection); + } + }, + [rowsById, setSelection, clearSelection] + ); const columns = useMemo>>( () => [ @@ -170,27 +215,45 @@ export function DataTable(props: DataTableProps): ReactElement { ), }, + ...(actionsList && actionsList.length > 0 + ? [ + { + field: 'actions', + headerName: 'Actions', + type: 'actions' as const, + width: 100, + getActions: ({ row }: { row: Row }) => + getItemActionButtons({ id: row.traceId, data: row as unknown as Record }), + }, + ] + : []), ], - [serviceColorGenerator] + [serviceColorGenerator, actionsList, getItemActionButtons] ); return ( - row.traceId} - getRowHeight={() => 'auto'} - getEstimatedRowHeight={() => 66} - disableRowSelectionOnClick={true} - pageSizeOptions={[10, 20, 50, 100]} - initialState={{ - pagination: { paginationModel: { pageSize: 20 } }, - sorting: { - sortModel: [{ field: 'startTimeUnixMs', sort: 'desc' }], - }, - }} - /> + <> + {confirmDialog} + row.traceId} + getRowHeight={() => 'auto'} + getEstimatedRowHeight={() => 66} + checkboxSelection={selectionEnabled} + rowSelectionModel={selectionEnabled ? rowSelectionModel : undefined} + onRowSelectionModelChange={selectionEnabled ? handleRowSelectionModelChange : undefined} + disableRowSelectionOnClick={!selectionEnabled} + pageSizeOptions={[10, 20, 50, 100]} + initialState={{ + pagination: { paginationModel: { pageSize: 20 } }, + sorting: { + sortModel: [{ field: 'startTimeUnixMs', sort: 'desc' }], + }, + }} + /> + ); } diff --git a/tracetable/src/TraceTable.ts b/tracetable/src/TraceTable.ts index 0790c018..a243ae9f 100644 --- a/tracetable/src/TraceTable.ts +++ b/tracetable/src/TraceTable.ts @@ -13,6 +13,8 @@ import { PanelPlugin } from '@perses-dev/plugin-system'; import { TraceTablePanel, TraceTablePanelProps } from './TraceTablePanel'; +import { TraceTableItemSelectionActionsEditor } from './TraceTableItemSelectionActionsEditor'; +import { TraceTableSelectionsEditor } from './TraceTableSelectionsEditor'; import { TraceTableOptions, createInitialTraceTableOptions } from './trace-table-model'; /** @@ -20,6 +22,8 @@ import { TraceTableOptions, createInitialTraceTableOptions } from './trace-table */ export const TraceTable: PanelPlugin = { PanelComponent: TraceTablePanel, + OptionsEditorComponent: TraceTableSelectionsEditor, + panelOptionsEditorComponents: [{ label: 'Item Actions', content: TraceTableItemSelectionActionsEditor }], supportedQueryTypes: ['TraceQuery'], createInitialOptions: createInitialTraceTableOptions, }; diff --git a/tracetable/src/TraceTableItemSelectionActionsEditor.tsx b/tracetable/src/TraceTableItemSelectionActionsEditor.tsx new file mode 100644 index 00000000..a8bcaf12 --- /dev/null +++ b/tracetable/src/TraceTableItemSelectionActionsEditor.tsx @@ -0,0 +1,44 @@ +// Copyright The Perses Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { + ActionOptions, + ItemSelectionActionsEditor, + OptionsEditorProps, + SelectionOptions, +} from '@perses-dev/plugin-system'; +import { ReactElement } from 'react'; +import { TraceTableOptions } from './trace-table-model'; + +type TraceTableItemSelectionActionsEditorProps = OptionsEditorProps; + +export function TraceTableItemSelectionActionsEditor(props: TraceTableItemSelectionActionsEditorProps): ReactElement { + const { onChange, value } = props; + + const handleActionsChange = (actions?: ActionOptions): void => { + onChange({ ...value, actions }); + }; + + const handleSelectionChange = (selection?: SelectionOptions): void => { + onChange({ ...value, selection }); + }; + + return ( + + ); +} diff --git a/tracetable/src/TraceTableSelectionsEditor.tsx b/tracetable/src/TraceTableSelectionsEditor.tsx new file mode 100644 index 00000000..d7fcd92c --- /dev/null +++ b/tracetable/src/TraceTableSelectionsEditor.tsx @@ -0,0 +1,28 @@ +// Copyright The Perses Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { OptionsEditorProps, SelectionOptions, SelectionOptionsEditor } from '@perses-dev/plugin-system'; +import { ReactElement } from 'react'; +import { TraceTableOptions } from './trace-table-model'; + +type TraceTableSelectionsEditorProps = OptionsEditorProps; + +export function TraceTableSelectionsEditor(props: TraceTableSelectionsEditorProps): ReactElement { + const { onChange, value } = props; + + const handleSelectionChange = (selection?: SelectionOptions): void => { + onChange({ ...value, selection }); + }; + + return ; +} diff --git a/tracetable/src/index.ts b/tracetable/src/index.ts index 5d17e23c..375a79fb 100644 --- a/tracetable/src/index.ts +++ b/tracetable/src/index.ts @@ -15,4 +15,5 @@ export * from './DataTable'; export { getPluginModule } from './getPluginModule'; export * from './trace-table-model'; export * from './TraceTable'; +export * from './TraceTableItemSelectionActionsEditor'; export * from './TraceTablePanel'; diff --git a/tracetable/src/trace-table-model.ts b/tracetable/src/trace-table-model.ts index b102adcb..2fa7a208 100644 --- a/tracetable/src/trace-table-model.ts +++ b/tracetable/src/trace-table-model.ts @@ -11,6 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +import { ActionsOptions, SelectionOptions } from '@perses-dev/plugin-system'; + /** * The Options object type supported by the TraceTable panel plugin. */ @@ -18,6 +20,8 @@ export interface TraceTableOptions { visual?: TraceTableVisualOptions; links?: TraceTableCustomLinks; + selection?: SelectionOptions; + actions?: ActionsOptions; } export interface TraceTableVisualOptions {