From 4f783e467ba3fba3ab4968980a6efac92b4614bb Mon Sep 17 00:00:00 2001 From: xwj02155382 Date: Wed, 14 May 2025 14:33:26 +0800 Subject: [PATCH 1/2] feat: add query cell --- packages/studio-driver/.npmrc | 1 + packages/studio-query/.npmrc | 1 + packages/studio-query/package.json | 27 +- .../studio-query/src/app/content/header.tsx | 88 +-- .../studio-query/src/app/content/index.tsx | 211 +++++- packages/studio-query/src/app/context.tsx | 7 +- .../QueryCell/SortableQueryCell.tsx | 52 ++ .../src/components/QueryCell/index.tsx | 329 +++++++++ packages/studio-query/src/index.tsx | 3 + .../src/statement/result/graph.tsx | 7 +- .../src/statement/result/index.tsx | 72 +- .../studio-query/src/statement/result/raw.tsx | 23 +- .../src/statement/result/table.tsx | 47 +- pnpm-lock.yaml | 677 ++++++++++-------- todo.md | 12 + 15 files changed, 1121 insertions(+), 436 deletions(-) create mode 100644 packages/studio-driver/.npmrc create mode 100644 packages/studio-query/.npmrc create mode 100644 packages/studio-query/src/components/QueryCell/SortableQueryCell.tsx create mode 100644 packages/studio-query/src/components/QueryCell/index.tsx create mode 100644 todo.md diff --git a/packages/studio-driver/.npmrc b/packages/studio-driver/.npmrc new file mode 100644 index 000000000..6ab414d06 --- /dev/null +++ b/packages/studio-driver/.npmrc @@ -0,0 +1 @@ +registry=http://registry.anpm.alibaba-inc.com \ No newline at end of file diff --git a/packages/studio-query/.npmrc b/packages/studio-query/.npmrc new file mode 100644 index 000000000..6ab414d06 --- /dev/null +++ b/packages/studio-query/.npmrc @@ -0,0 +1 @@ +registry=http://registry.anpm.alibaba-inc.com \ No newline at end of file diff --git a/packages/studio-query/package.json b/packages/studio-query/package.json index 7d14227a3..2df74d9ad 100644 --- a/packages/studio-query/package.json +++ b/packages/studio-query/package.json @@ -28,22 +28,25 @@ "father": "^4.4.1" }, "dependencies": { - "@graphscope/studio-components": "workspace:*", - "@graphscope/use-zustand": "workspace:*", - "@graphscope/studio-graph": "workspace:*", - "@graphscope/studio-driver": "workspace:*", - "@graphscope/studio-draw-pattern": "workspace:*", - "react-json-view": "^1.21.3", - "react-intl": "^6.6.1", + "@antv/g2": "^5.2.8", + "@dnd-kit/core": "^6.0.8", + "@dnd-kit/sortable": "^7.0.2", + "@dnd-kit/utilities": "^3.2.1", + "@fortawesome/fontawesome-svg-core": "latest", "@fortawesome/free-solid-svg-icons": "latest", "@fortawesome/react-fontawesome": "latest", - "@fortawesome/fontawesome-svg-core": "latest", - "@antv/g2": "^5.2.8", - "uuid": "^9.0.1", - "dayjs": "^1.11.10", "@graphscope/_test_gremlin_": "^0.1.2", + "@graphscope/studio-components": "workspace:*", + "@graphscope/studio-draw-pattern": "workspace:*", + "@graphscope/studio-driver": "workspace:*", + "@graphscope/studio-graph": "workspace:*", + "@graphscope/use-zustand": "workspace:*", + "dayjs": "^1.11.10", + "monaco-editor": "^0.50.0", "neo4j-driver": "^5.12.0", - "monaco-editor": "^0.50.0" + "react-intl": "^6.6.1", + "react-json-view": "^1.21.3", + "uuid": "^9.0.1" }, "author": "", "license": "ISC" diff --git a/packages/studio-query/src/app/content/header.tsx b/packages/studio-query/src/app/content/header.tsx index 43aec86ce..a7f5e0d31 100644 --- a/packages/studio-query/src/app/content/header.tsx +++ b/packages/studio-query/src/app/content/header.tsx @@ -1,16 +1,12 @@ import React, { useRef, useState, Suspense } from 'react'; -import { InsertRowAboveOutlined, OrderedListOutlined, PlayCircleOutlined } from '@ant-design/icons'; -import { Segmented, Button, Space, Flex } from 'antd'; +import { InsertRowAboveOutlined, OrderedListOutlined } from '@ant-design/icons'; +import { Segmented, Space, Flex } from 'antd'; import { IStudioQueryProps, localStorageVars } from '../context'; import { useContext } from '../context'; import { Utils } from '@graphscope/studio-components'; -import { countLines } from '../utils'; -import { v4 as uuidv4 } from 'uuid'; import ToggleButton from './toggle-button'; -import CypherEditor from '../../components/cypher-editor'; import { DrawPatternModal } from '../../components/draw-pattern-modal'; -const { debounce } = Utils; interface IHeaderProps { connectComponent?: IStudioQueryProps['connectComponent']; displaySidebarPosition?: IStudioQueryProps['displaySidebarPosition']; @@ -47,6 +43,7 @@ const ModeSwitch = () => { /> ); }; + const LanguageSwitch = () => { const { updateStore, store } = useContext(); const { language } = store; @@ -73,56 +70,8 @@ const LanguageSwitch = () => { const Header: React.FunctionComponent = props => { const { connectComponent, displaySidebarPosition } = props; - const { updateStore, store } = useContext(); - const editorRef = useRef(null); - const [state, updateState] = useState({ - // lineCount: 1, - clear: false, - }); - - const { globalScript, autoRun, language, graphId } = store; - - // const handleChange = value => {}; - const onChangeContent = () => { - updateState(preState => { - return { - ...preState, - // lineCount: line, - clear: false, - }; - }); - }; - const handleQuery =debounce(() => { - if (editorRef.current) { - const value = editorRef.current.codeEditor.getValue(); - if (value === '') { - return; - } - updateStore(draft => { - draft.globalScript = ''; - const id = uuidv4(); - draft.statements = [ - { - id, - name: id, - script: value, - language: language, - }, - ...draft.statements, - ]; - draft.activeId = id; - }); - - updateState(preState => { - return { - ...preState, - clear: true, - }; - }); - } - }, 500); - - const minRows = countLines(globalScript); + const { store } = useContext(); + const { language } = store; return (
= props => { {connectComponent} - + {displaySidebarPosition === 'right' && } - - { - if (autoRun) { - handleQuery(); - } - }} - /> -
-
-
); }; diff --git a/packages/studio-query/src/app/content/index.tsx b/packages/studio-query/src/app/content/index.tsx index 5dfbd344c..05f704f05 100644 --- a/packages/studio-query/src/app/content/index.tsx +++ b/packages/studio-query/src/app/content/index.tsx @@ -1,14 +1,30 @@ import React, { useState, memo, lazy, Suspense, useEffect } from 'react'; // import Statement from '../../statement'; const Statement = lazy(() => import('../../statement')); +const QueryCell = lazy(() => import('../../components/QueryCell')); +const SortableQueryCell = lazy(() => import('../../components/QueryCell/SortableQueryCell')); // import Header from './header'; const Header = lazy(() => import('./header')); -import { Segmented, theme } from 'antd'; +import { Segmented, theme, Button, Flex } from 'antd'; import { useContext } from '../context'; import type { IStatement, IStudioQueryProps } from '../context'; -import { PlayCircleOutlined } from '@ant-design/icons'; +import { PlayCircleOutlined, PlusOutlined } from '@ant-design/icons'; import Welcome from './welcome'; import Empty from './empty'; +import { v4 as uuidv4 } from 'uuid'; +import { + DndContext, + closestCenter, + PointerSensor, + KeyboardSensor, + DragEndEvent, + useSensor, + useSensors +} from '@dnd-kit/core'; +import { arrayMove, SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy } from '@dnd-kit/sortable'; + +type ModeType = 'tabs' | 'flow'; + interface IContentProps { createStatements: IStudioQueryProps['createStatements']; queryGraphData: IStudioQueryProps['queryGraphData']; @@ -33,6 +49,38 @@ const Content: React.FunctionComponent = props => { const savedIds = savedStatements.map(item => item.id); const { token } = useToken(); + // 配置拖拽传感器 + const sensors = useSensors( + useSensor(PointerSensor, { + activationConstraint: { + distance: 5, // 5px移动距离后才激活拖拽 + } + }), + useSensor(KeyboardSensor, { + coordinateGetter: sortableKeyboardCoordinates, + }) + ); + + // 添加状态以跟踪全屏状态 + const [fullscreenId, setFullscreenId] = useState(null); + + // 初始化时如果没有语句,添加一个默认的语句 + useEffect(() => { + if (statements.length === 0) { + const id = uuidv4(); + updateStore(draft => { + draft.statements = [ + { + id, + script: '', + language, + }, + ]; + draft.activeId = id; + }); + } + }, []); + const statementStyles = mode === 'tabs' ? ({ @@ -71,6 +119,7 @@ const Content: React.FunctionComponent = props => { } }); }; + const onClose = id => { updateStore(draft => { draft.statements = draft.statements.filter(item => { @@ -79,6 +128,36 @@ const Content: React.FunctionComponent = props => { draft.activeId = draft.statements[0] && draft.statements[0].id; }); }; + + // 添加新的 QueryCell + const addNewCell = () => { + const id = uuidv4(); + updateStore(draft => { + draft.statements = [ + ...draft.statements, + { + id, + script: '', + language, + }, + ]; + draft.activeId = id; + }); + }; + + // 处理拖拽结束事件 + const handleDragEnd = (event: DragEndEvent) => { + const { active, over } = event; + + if (over && active.id !== over.id) { + updateStore(draft => { + const oldIndex = draft.statements.findIndex(item => item.id === active.id); + const newIndex = draft.statements.findIndex(item => item.id === over.id); + draft.statements = arrayMove(draft.statements, oldIndex, newIndex); + }); + } + }; + const isEmpty = statements.length === 0; /** activeId !== undefined 或值不改变则不滚动*/ useEffect(() => { @@ -86,6 +165,12 @@ const Content: React.FunctionComponent = props => { document.getElementById('statements-layout')?.scrollTo({ top: 0, behavior: 'smooth' }); } }, [activeId]); + + // 在适当位置添加 handleFullscreen 函数 + const handleFullscreen = (id: string, isFullscreen: boolean) => { + setFullscreenId(isFullscreen ? id : null); + }; + return (
= props => { id="statements-layout" style={{ overflowY: 'scroll', flex: '1', position: 'relative', background: token.colorBgLayout }} > - {isEmpty && } + {/* {isEmpty && } */} - {statements.map(item => { - const { id, script, timestamp, language } = item; - return ( -
+ item.id)} + strategy={verticalListSortingStrategy} > - - - -
- ); - })} + {statements.map((item, index) => { + const { id, script, timestamp, language } = item; + return ( + + handleFullscreen(id, isFullscreen)} + isFullscreen={fullscreenId === id} + style={{ + display: fullscreenId === null || fullscreenId === id ? undefined : 'none', + }} + /> + + ); + })} + + + ) : ( + // tabs 模式下使用普通的 QueryCell 组件 + statements.map(item => { + const { id, script, timestamp, language } = item; + return ( +
+ + handleFullscreen(id, isFullscreen)} + isFullscreen={fullscreenId === id} + style={{ + display: fullscreenId === null || fullscreenId === id ? undefined : 'none', + }} + /> + +
+ ); + }) + )} + + {/* 添加新单元格按钮 */} + + +
); diff --git a/packages/studio-query/src/app/context.tsx b/packages/studio-query/src/app/context.tsx index 376f8f19c..8ac7c9633 100644 --- a/packages/studio-query/src/app/context.tsx +++ b/packages/studio-query/src/app/context.tsx @@ -62,9 +62,9 @@ export const initialStore: IStore<{}> = { graphId: '', activeNavbar: 'recommended', collapse: true, - activeId: 'query-1', - /** 全局语句 */ - globalScript: 'Match (n) return n limit 10', + activeId: '', + /** 全局语句 - 不再需要 */ + globalScript: '', /** autoRun */ autoRun: false, /** 启用绝对布局 */ @@ -81,6 +81,7 @@ export const initialStore: IStore<{}> = { savedStatements: [], /** 存储过程语句 */ storeProcedures: [], + /** 设置默认为 flow 模式 */ mode: 'flow', enableImmediateQuery: false, language: 'gremlin', diff --git a/packages/studio-query/src/components/QueryCell/SortableQueryCell.tsx b/packages/studio-query/src/components/QueryCell/SortableQueryCell.tsx new file mode 100644 index 000000000..dd868b3fd --- /dev/null +++ b/packages/studio-query/src/components/QueryCell/SortableQueryCell.tsx @@ -0,0 +1,52 @@ +import React from 'react'; +import { useSortable } from '@dnd-kit/sortable'; +import { CSS } from '@dnd-kit/utilities'; +import QueryCell, { IQueryCellProps } from './index'; + +interface ISortableQueryCellProps extends Omit { + index: number; +} + +const SortableQueryCell: React.FC = (props) => { + const { id, index } = props; + + const { + attributes, + listeners, + setNodeRef, + transform, + transition, + isDragging + } = useSortable({ + id: id, + data: { + index, + id + } + }); + + const style = { + transform: CSS.Transform.toString(transform), + transition, + opacity: isDragging ? 0.5 : 1, + zIndex: isDragging ? 999 : 'auto', + }; + + return ( +
+ +
+ ); +}; + +export default SortableQueryCell; \ No newline at end of file diff --git a/packages/studio-query/src/components/QueryCell/index.tsx b/packages/studio-query/src/components/QueryCell/index.tsx new file mode 100644 index 000000000..28c940320 --- /dev/null +++ b/packages/studio-query/src/components/QueryCell/index.tsx @@ -0,0 +1,329 @@ +import React, { useState, useRef, useEffect } from 'react'; +import { theme, Button, Tooltip, Space } from 'antd'; +import dayjs from 'dayjs'; +import { useIntl } from 'react-intl'; +import { Utils } from '@graphscope/studio-components'; +import { UpOutlined, DownOutlined, DragOutlined, FullscreenOutlined, FullscreenExitOutlined } from '@ant-design/icons'; +import Editor from '../../statement/editor'; +import Result from '../../statement/result'; +import { IEditorProps } from '../../statement/typing'; + +const { debounce } = Utils; + +export type IQueryCellProps = IEditorProps & { + /** 是否是当前激活的语句 */ + active: boolean; + mode?: 'tabs' | 'flow'; + enableImmediateQuery: boolean; + graphId: string; + /** 时间戳 */ + timestamp?: number; + /** 拖拽相关属性 */ + dragHandleProps?: any; + /** 单元格索引 */ + index?: number; + /** 全屏状态变化回调 */ + onFullscreen?: (isFullscreen: boolean) => void; + /** 是否处于全屏状态 */ + isFullscreen?: boolean; + /** 自定义样式 */ + style?: React.CSSProperties; +}; +const { useToken } = theme; + +const QueryCell: React.FC = props => { + const { + onQuery, + onClose, + onCancel, + onSave, + script, + id, + active, + mode, + schemaData, + enableImmediateQuery, + graphId, + timestamp, + language, + dragHandleProps, + index, + onFullscreen, + isFullscreen: propIsFullscreen, + style: customStyle, + } = props; + const { token } = useToken(); + const intl = useIntl(); + const [collapsed, setCollapsed] = useState(false); + const [localFullscreen, setLocalFullscreen] = useState(false); + + // 使用 prop 或 local 状态作为实际的全屏状态 + const fullscreen = propIsFullscreen !== undefined ? propIsFullscreen : localFullscreen; + + const borderStyle = + active && mode === 'flow' + ? { + border: `1px solid ${token.colorPrimary}`, + } + : { + border: `1px solid ${token.colorBorder}`, + }; + const ContainerRef = useRef(null); + const [state, updateState] = useState({ + data: {}, + isFetching: false, + startTime: 0, + endTime: 0, + abort: false, + }); + const { data, isFetching, startTime, endTime } = state; + useEffect(() => { + if (ContainerRef.current && active && mode === 'flow') { + ContainerRef.current.scrollIntoView({ behavior: 'smooth' }); + } + }, [active]); + + // 检查是否有数据(查询结果) + const hasQueryResult = () => { + if (!data) return false; + + // 检查图数据 + if ((data as any).nodes && (data as any).nodes.length > 0) return true; + if ((data as any).edges && (data as any).edges.length > 0) return true; + + // 检查表格数据 + if ((data as any).table && (data as any).table.length > 0) return true; + + // 检查原始数据 + if ((data as any).raw && + ((data as any).raw.records?.length > 0 || + (data as any).raw.rows?.length > 0 || + Object.keys((data as any).raw).length > 0)) { + return true; + } + + return false; + }; + + const handleQuery = debounce(async params => { + if (isFetching) { + onCancel && onCancel(params); + updateState(preState => { + return { + ...preState, + isFetching: false, + data: {}, + }; + }); + return; + } + updateState(preState => { + return { + ...preState, + isFetching: true, + startTime: new Date().getTime(), + }; + }); + const res = await onQuery(params); + //@ts-ignore + updateState(preState => { + return { + ...preState, + data: res, + isFetching: false, + endTime: new Date().getTime(), + }; + }); + }, 500); + + useEffect(() => { + if (enableImmediateQuery) { + console.log('enableImmediateQuery script', enableImmediateQuery, script, language); + handleQuery({ id, script, language }); + } + }, [enableImmediateQuery]); + + const isRunning = endTime - startTime < 0; + const message = isRunning + ? intl.formatMessage( + { + id: "query submmited on {submitTime}. It's running ... ", + }, + { + submitTime: dayjs(startTime).format('HH:mm:ss YYYY-MM-DD'), + }, + ) + : intl.formatMessage( + { + id: 'query submmited on {submitTime}. Running {runningTime} ms', + }, + { + submitTime: dayjs(startTime).format('HH:mm:ss YYYY-MM-DD'), + runningTime: endTime - startTime, + }, + ); + + const toggleCollapse = () => { + setCollapsed(!collapsed); + }; + + const toggleFullscreen = () => { + const newFullscreenState = !fullscreen; + // 如果有外部控制,则调用回调 + if (onFullscreen) { + onFullscreen(newFullscreenState); + } else { + // 否则使用本地状态 + setLocalFullscreen(newFullscreenState); + } + }; + + // 修改:只要有查询结果就显示折叠/展开按钮,不再受折叠状态影响 + const hasResult = hasQueryResult(); + // 显示结果条件:未折叠 && 有查询结果 + const showResult = !collapsed && hasResult; + + // 计算容器高度 - 根据是否全屏和是否折叠调整 + const containerHeight = fullscreen + ? 'calc(100vh - 126px)' + : 'auto'; + + // 计算结果区域高度 + const resultHeight = fullscreen + ? collapsed ? 'auto' : 'calc(100vh - 326px)' + : collapsed ? 'auto' : '540px'; + + return ( +
+
+
+ {mode === 'flow' && !fullscreen && ( + + + + )} + {index !== undefined && ( + #{index + 1} + )} +
+ + {/* 修改:只要有查询结果就显示折叠/展开按钮 */} + {hasResult && ( + +
+ +
+ +
+ + {/* 修改:折叠时显示一个提示行 */} + {hasResult && collapsed && ( +
+ 点击此处或上方按钮展开查询结果 +
+ )} + + {showResult && ( +
+ +
+ )} +
+ ); +}; + +export default QueryCell; \ No newline at end of file diff --git a/packages/studio-query/src/index.tsx b/packages/studio-query/src/index.tsx index c8100972f..70e95c9b4 100644 --- a/packages/studio-query/src/index.tsx +++ b/packages/studio-query/src/index.tsx @@ -3,8 +3,11 @@ import App from './app'; export type { CypherSchemaData } from './components/cypher-editor'; export type { IStudioQueryProps } from './app/context'; export type { IStatement } from './app/context'; +export type { IQueryCellProps } from './components/QueryCell'; export { default as Statement } from './statement/index'; +export { default as QueryCell } from './components/QueryCell'; +export { default as SortableQueryCell } from './components/QueryCell/SortableQueryCell'; export default App; export { default as QueryStatement } from './sdk/query-statement'; export { default as sdk } from './sdk'; diff --git a/packages/studio-query/src/statement/result/graph.tsx b/packages/studio-query/src/statement/result/graph.tsx index d6cb279cd..8a40c54e8 100644 --- a/packages/studio-query/src/statement/result/graph.tsx +++ b/packages/studio-query/src/statement/result/graph.tsx @@ -27,7 +27,12 @@ const GraphView: React.FunctionComponent = props => { const graphSchema = transGraphSchema(schemaData); return ( -
+
{/** @ts-ignore */}
diff --git a/packages/studio-query/src/statement/result/index.tsx b/packages/studio-query/src/statement/result/index.tsx index 445b7f9f4..f3e5d05bc 100644 --- a/packages/studio-query/src/statement/result/index.tsx +++ b/packages/studio-query/src/statement/result/index.tsx @@ -1,10 +1,11 @@ -import React, { memo } from 'react'; +import React, { memo, useEffect, useState } from 'react'; import { Tabs } from 'antd'; import TableView from './table'; import RawView from './raw'; import GraphView from './graph'; import { useIntl } from 'react-intl'; import type { IEditorProps } from '../typing'; +import { useDynamicStyle } from '@graphscope/studio-components' import { DeploymentUnitOutlined, TableOutlined, BarChartOutlined, CodeOutlined } from '@ant-design/icons'; interface IResultProps { @@ -64,6 +65,37 @@ const Result: React.FunctionComponent = props => { const { viewMode, options } = getOptions(data, isFetching, activeKey); + // 使用 useDynamicStyle 添加样式 + useDynamicStyle('result-tabs-styles', ` + .result-tabs { + height: 100%; + display: flex; + flex-direction: column; + } + .result-tabs .ant-tabs-content { + flex: 1; + height: 100%; + } + .result-tabs .ant-tabs-content-holder { + height: 100%; + overflow: hidden; + } + .result-tabs .ant-tabs-tabpane { + height: 100%; + overflow: auto; + } + .result-tabs .ant-tabs-tabpane > div { + height: 100%; + } + .ant-table-wrapper { + height: 100%; + } + .ant-spin-nested-loading, + .ant-spin-container { + height: 100%; + } + `); + const handleChange = value => { setActiveKey(value); }; @@ -72,32 +104,60 @@ const Result: React.FunctionComponent = props => { return options.indexOf(type) !== -1; }; + // 用于所有Tab内容的通用容器样式 + const tabContentContainerStyle = { + height: '100%', + width: '100%', + padding: '0', + }; + + // 包装Tab内容的函数 + const wrapTabContent = (content) => ( +
+ {content} +
+ ); + const items = [ { label: intl.formatMessage({ id: 'Graph' }), key: 'graph', icon: , - children: , + children: wrapTabContent(), disabled: !isExist('graph'), }, { label: intl.formatMessage({ id: 'Table' }), key: 'table', icon: , - children: , + children: wrapTabContent(), disabled: !isExist('table'), }, { label: intl.formatMessage({ id: 'Raw' }), key: 'raw', icon: , - children: , + children: wrapTabContent(), disabled: !isExist('raw'), }, ]; + return ( -
- +
+
); }; diff --git a/packages/studio-query/src/statement/result/raw.tsx b/packages/studio-query/src/statement/result/raw.tsx index 62455f9bf..4b003c605 100644 --- a/packages/studio-query/src/statement/result/raw.tsx +++ b/packages/studio-query/src/statement/result/raw.tsx @@ -18,9 +18,26 @@ const RawView: React.FunctionComponent = props => { } return ( -
- - {/*
{JSON.stringify(data.raw, null, 2)}
*/} +
+
); }; diff --git a/packages/studio-query/src/statement/result/table.tsx b/packages/studio-query/src/statement/result/table.tsx index 6650eb473..1e67c846b 100644 --- a/packages/studio-query/src/statement/result/table.tsx +++ b/packages/studio-query/src/statement/result/table.tsx @@ -185,6 +185,7 @@ const TableView: React.FunctionComponent = props => { }); Utils.createDownload(JSON.stringify({ nodes: _nodes, edges: _edges }, null, 2), 'result.json'); }; + /** table 表格 */ let Content: React.ReactNode; @@ -196,15 +197,34 @@ const TableView: React.FunctionComponent = props => { Content = ; } //@ts-ignore - if (table.length === 0 && window.GS_ENGINE_TYPE === 'interactive' && raw.records.length !== 0) { + if (table.length === 0 && window.GS_ENGINE_TYPE === 'interactive' && raw?.records?.length !== 0) { Content = ; } } + // 表格视图的分页配置 + const tablePaginationConfig = { + simple: true, + pageSize: 10, + size: 'small', + }; + return ( -
- - {description} +
+
+ {description} = props => { { value: 'chart', icon: , label: 'chart' }, { value: 'table', icon: }, ]} + size="small" /> - + - - {/* {mode === 'table' && nodes.length !== 0 && } */} - {/* {mode === 'table' && raw.records.length !== 0 && } */} - {Content} - {mode === 'chart' && table.length !== 0 && } +
+
+ {Content} + {mode === 'chart' && table.length !== 0 && } +
); }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e6f513d90..2197bc341 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -74,7 +74,7 @@ importers: version: 2.27.10 '@types/node': specifier: latest - version: 22.13.14 + version: 22.15.17 '@types/react': specifier: 18.2.0 version: 18.2.0 @@ -89,13 +89,13 @@ importers: version: 6.11.0(webpack@5.96.1) dumi: specifier: ^2.2.17 - version: 2.4.14(@babel/core@7.26.0)(@swc/helpers@0.5.15)(@types/node@22.13.14)(@types/react@18.2.0)(eslint@9.23.0)(lightningcss@1.22.1)(prettier@3.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@3.29.5)(stylelint@14.16.1)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1) + version: 2.4.14(@babel/core@7.26.0)(@swc/helpers@0.5.15)(@types/node@22.15.17)(@types/react@18.2.0)(eslint@9.26.0)(lightningcss@1.22.1)(prettier@3.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@3.29.5)(stylelint@14.16.1)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1) dumi-theme-antd: specifier: ^0.4.2 - version: 0.4.2(@babel/core@7.26.0)(@types/react@18.2.0)(antd@5.22.2(date-fns@2.30.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(date-fns@2.30.0)(dumi@2.4.14(@babel/core@7.26.0)(@swc/helpers@0.5.15)(@types/node@22.13.14)(@types/react@18.2.0)(eslint@9.23.0)(lightningcss@1.22.1)(prettier@3.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@3.29.5)(stylelint@14.16.1)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1))(immer@10.1.1)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0) + version: 0.4.2(@babel/core@7.26.0)(@types/react@18.2.0)(antd@5.22.2(date-fns@2.30.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(date-fns@2.30.0)(dumi@2.4.14(@babel/core@7.26.0)(@swc/helpers@0.5.15)(@types/node@22.15.17)(@types/react@18.2.0)(eslint@9.26.0)(lightningcss@1.22.1)(prettier@3.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@3.29.5)(stylelint@14.16.1)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1))(immer@10.1.1)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0) father: specifier: ^4.4.1 - version: 4.5.1(@babel/core@7.26.0)(@types/node@22.13.14)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0))(type-fest@1.4.0)(webpack@5.96.1) + version: 4.5.1(@babel/core@7.26.0)(@types/node@22.15.17)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0))(type-fest@1.4.0)(webpack@5.96.1) file-loader: specifier: ^6.2.0 version: 6.2.0(webpack@5.96.1) @@ -259,7 +259,7 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.3.3(vite@5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) + version: 4.3.3(vite@5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) jszip: specifier: ^3.10.1 version: 3.10.1 @@ -268,13 +268,13 @@ importers: version: 2.8.1 vite: specifier: ^5.4.16 - version: 5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) + version: 5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) vite-plugin-top-level-await: specifier: ^1.4.4 - version: 1.4.4(@swc/helpers@0.5.15)(rollup@4.38.0)(vite@5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) + version: 1.4.4(@swc/helpers@0.5.15)(rollup@4.38.0)(vite@5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) vite-plugin-wasm: specifier: ^3.3.0 - version: 3.3.0(vite@5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) + version: 3.3.0(vite@5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) examples/mcp-portal: dependencies: @@ -384,19 +384,19 @@ importers: version: 9.0.8 '@vitejs/plugin-react': specifier: ^4.3.1 - version: 4.3.3(vite@5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) + version: 4.3.3(vite@5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) father: specifier: ^4.4.5 - version: 4.5.1(@babel/core@7.26.0)(@types/node@22.14.1)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0))(type-fest@1.4.0)(webpack@5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.96.1))) + version: 4.5.1(@babel/core@7.26.0)(@types/node@22.15.17)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0))(type-fest@1.4.0)(webpack@5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.96.1))) typescript: specifier: ^5.5.4 version: 5.6.3 vite: specifier: ^5.4.16 - version: 5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) + version: 5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) vitest: specifier: ^2.0.5 - version: 2.1.5(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) + version: 2.1.5(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) packages/studio-driver: dependencies: @@ -408,7 +408,7 @@ importers: version: 0.7.0 kuzu-wasm: specifier: latest - version: 0.8.2 + version: 0.10.0 neo4j-driver: specifier: ^5.12.0 version: 5.26.0 @@ -457,16 +457,16 @@ importers: devDependencies: '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.3.3(vite@5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) + version: 4.3.3(vite@5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) vite: specifier: ^5.4.16 - version: 5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) + version: 5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) vite-plugin-top-level-await: specifier: ^1.4.4 - version: 1.4.4(@swc/helpers@0.5.15)(rollup@4.38.0)(vite@5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) + version: 1.4.4(@swc/helpers@0.5.15)(rollup@4.38.0)(vite@5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) vite-plugin-wasm: specifier: ^3.3.0 - version: 3.3.0(vite@5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) + version: 3.3.0(vite@5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) packages/studio-graph: dependencies: @@ -542,10 +542,10 @@ importers: version: 3.1.7 '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.3.4(vite@6.2.4(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)(yaml@2.5.1)) + version: 4.3.4(vite@6.2.4(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)(yaml@2.5.1)) vite: specifier: ^6.0.3 - version: 6.2.4(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)(yaml@2.5.1) + version: 6.2.4(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)(yaml@2.5.1) packages/studio-graph-editor: dependencies: @@ -600,10 +600,10 @@ importers: version: 4.17.13 '@vitejs/plugin-react': specifier: ^4.2.1 - version: 4.3.3(vite@5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) + version: 4.3.3(vite@5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) vite: specifier: ^5.4.16 - version: 5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) + version: 5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) packages/studio-importor: dependencies: @@ -658,6 +658,70 @@ importers: version: 9.0.1 packages/studio-query: + dependencies: + '@antv/g2': + specifier: ^5.2.8 + version: 5.2.8 + '@dnd-kit/core': + specifier: ^6.3.1 + version: 6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@dnd-kit/sortable': + specifier: ^10.0.0 + version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0) + '@dnd-kit/utilities': + specifier: ^3.2.2 + version: 3.2.2(react@18.2.0) + '@fortawesome/fontawesome-svg-core': + specifier: latest + version: 6.7.2 + '@fortawesome/free-solid-svg-icons': + specifier: latest + version: 6.7.2 + '@fortawesome/react-fontawesome': + specifier: latest + version: 0.2.2(@fortawesome/fontawesome-svg-core@6.7.2)(react@18.2.0) + '@graphscope/_test_gremlin_': + specifier: ^0.1.2 + version: 0.1.2 + '@graphscope/studio-components': + specifier: workspace:* + version: link:../studio-components + '@graphscope/studio-draw-pattern': + specifier: workspace:* + version: link:../studio-draw-pattern + '@graphscope/studio-driver': + specifier: workspace:* + version: link:../studio-driver + '@graphscope/studio-graph': + specifier: workspace:* + version: link:../studio-graph + '@graphscope/use-zustand': + specifier: workspace:* + version: link:../use-zustand + dayjs: + specifier: ^1.11.10 + version: 1.11.13 + monaco-editor: + specifier: ^0.50.0 + version: 0.50.0 + neo4j-driver: + specifier: ^5.12.0 + version: 5.26.0 + react-intl: + specifier: ^6.6.1 + version: 6.8.9(react@18.2.0)(typescript@5.3.3) + react-json-view: + specifier: ^1.21.3 + version: 1.21.3(@types/react@18.2.0)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + uuid: + specifier: ^9.0.1 + version: 9.0.1 + devDependencies: + father: + specifier: ^4.4.1 + version: 4.5.1(@babel/core@7.26.0)(@types/node@22.15.17)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0))(type-fest@1.4.0)(webpack@5.96.1) + + packages/studio-query2: dependencies: '@antv/g2': specifier: ^5.2.8 @@ -710,7 +774,7 @@ importers: devDependencies: father: specifier: ^4.4.1 - version: 4.5.1(@babel/core@7.26.0)(@types/node@22.14.1)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0))(type-fest@1.4.0)(webpack@5.96.1(webpack-cli@5.1.4(webpack@5.96.1))) + version: 4.5.1(@babel/core@7.26.0)(@types/node@22.15.17)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0))(type-fest@1.4.0)(webpack@5.96.1) packages/studio-server: dependencies: @@ -832,7 +896,7 @@ importers: version: 9.0.8 '@umijs/lint': specifier: latest - version: 4.4.6(eslint@9.23.0)(stylelint@14.16.1)(typescript@5.6.3) + version: 4.4.10(eslint@9.26.0)(stylelint@14.16.1)(typescript@5.6.3) '@vitejs/plugin-react': specifier: ^4.2.1 version: 4.3.3(vite@5.4.16(@types/node@22.9.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) @@ -841,7 +905,7 @@ importers: version: 16.4.5 eslint: specifier: latest - version: 9.23.0 + version: 9.26.0 monaco-editor-webpack-plugin: specifier: ^7.1.0 version: 7.1.0(monaco-editor@0.52.2)(webpack@5.96.1(webpack-cli@5.1.4(webpack@5.96.1))) @@ -890,13 +954,13 @@ importers: version: 18.2.0 '@vitejs/plugin-react': specifier: ^4.3.3 - version: 4.3.3(vite@5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) + version: 4.3.3(vite@5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) father: specifier: ^4.4.1 - version: 4.5.1(@babel/core@7.26.0)(@types/node@22.14.1)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0))(type-fest@1.4.0)(webpack@5.96.1(webpack-cli@5.1.4(webpack@5.96.1))) + version: 4.5.1(@babel/core@7.26.0)(@types/node@22.15.17)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0))(type-fest@1.4.0)(webpack@5.96.1) vite: specifier: ^5.4.16 - version: 5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) + version: 5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) packages: @@ -1565,6 +1629,28 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} + '@dnd-kit/accessibility@3.1.1': + resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} + peerDependencies: + react: 18.2.0 + + '@dnd-kit/core@6.3.1': + resolution: {integrity: sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==} + peerDependencies: + react: 18.2.0 + react-dom: 18.2.0 + + '@dnd-kit/sortable@10.0.0': + resolution: {integrity: sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==} + peerDependencies: + '@dnd-kit/core': ^6.3.0 + react: 18.2.0 + + '@dnd-kit/utilities@3.2.2': + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: 18.2.0 + '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} @@ -2347,32 +2433,32 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.2': - resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.2.0': - resolution: {integrity: sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==} + '@eslint/config-helpers@0.2.2': + resolution: {integrity: sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.12.0': - resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + '@eslint/core@0.13.0': + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.1': resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.23.0': - resolution: {integrity: sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==} + '@eslint/js@9.26.0': + resolution: {integrity: sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.7': - resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} + '@eslint/plugin-kit@0.2.8': + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@floating-ui/core@0.6.2': @@ -2712,6 +2798,10 @@ packages: '@microsoft/tsdoc@0.14.2': resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + '@modelcontextprotocol/sdk@1.11.2': + resolution: {integrity: sha512-H9vwztj5OAqHg9GockCQC06k1natgcxWQSRpQcPJf6i5+MWBzfKkRtxGbjQf0X2ihii0ffLZCRGbYV2f2bjNCQ==} + engines: {node: '>=18'} + '@modelcontextprotocol/sdk@1.6.1': resolution: {integrity: sha512-oxzMzYCkZHMntzuyerehK3fV6A2Kwh5BD6CGEJSVDU2QNEhfLOptf2X7esQgaHZXHZY0oHmMsOtIDLP71UJXgA==} engines: {node: '>=18'} @@ -3898,11 +3988,8 @@ packages: '@types/node@22.13.10': resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==} - '@types/node@22.13.14': - resolution: {integrity: sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==} - - '@types/node@22.14.1': - resolution: {integrity: sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw==} + '@types/node@22.15.17': + resolution: {integrity: sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==} '@types/node@22.8.7': resolution: {integrity: sha512-LidcG+2UeYIWcMuMUpBKOnryBWG/rnmOHQR5apjn8myTQcx3rinFRn7DcIFhMnS0PPFSC6OafdIKEad0lj6U0Q==} @@ -4084,8 +4171,8 @@ packages: '@umijs/babel-preset-umi@4.3.34': resolution: {integrity: sha512-DwnGVn1HJ3C2CtEWx4r+IABIwN+o6BvKAxTB2W5ChtAm2lyvOQWys/hT9cPu5ERaKfTbVjudPCktN2Z5Wp23/g==} - '@umijs/babel-preset-umi@4.4.6': - resolution: {integrity: sha512-SsQezW0JKAUGF9xi4LM1Kx10D4OZBkg7krqATz9Qvtvods1B3MPwRVg4tjAtZCJn5/46Wl12VgQfqxNUcVIQ3A==} + '@umijs/babel-preset-umi@4.4.10': + resolution: {integrity: sha512-nbrpQNEMsmbNVLFhEzL9vwrpFH+WPyqSQjmcCOe9tD7SBWH585juwcuuX6h8ODX6ZkdhGbShNA4MGW4c2rvGAQ==} '@umijs/bundler-esbuild@4.3.34': resolution: {integrity: sha512-vWF4QI/34hofwHDp0aJwiB/gcqa4zp/4jgykK9KZV+MLoM+qg/ZJoPWB5S6kvS8gnoGdNH14g9vXmT4rL0oQtA==} @@ -4097,6 +4184,9 @@ packages: '@umijs/bundler-utils@4.3.34': resolution: {integrity: sha512-++fJDhZENaT3e1Y8/gPh0/UvzNIGgRm54Xhv5kRvio1wApMeLhK7KRa4Q9GUP4jHuZ8dt3KYWO/CMr23/giCzg==} + '@umijs/bundler-utils@4.4.10': + resolution: {integrity: sha512-qGT4ylTgJQHWEZVDHv3vb7EHwyanpeCs42mPb7CT/Ivm+q/A5wPWFeSY6I8Ov6SVb6v9d2of6sP5NNAd7Qmckw==} + '@umijs/bundler-utils@4.4.6': resolution: {integrity: sha512-JTqva1w4OVNw9ARlHvRgWFiynGQEDXhG79dxaQ2OWw7Y/dKUk5NP67DIA6xlFFCWXLXWQYV0bsYm1ESmaSdk9g==} @@ -4185,8 +4275,8 @@ packages: '@umijs/lint@4.3.34': resolution: {integrity: sha512-PPzlFEa3LH1EAk5SWUHG3Sl2wiZLBnT8Ynfkaa953X4MS70E70C2gXXZLewap5O4rW7clVFanMWoGgnV8YsURQ==} - '@umijs/lint@4.4.6': - resolution: {integrity: sha512-Qt/YIUlt+QMz37syPZnMp+asQm3a5rmBGzN0xe/Waz3kW8lsi2zDa/Pxo468289rRMXFAPTWxcjfJeikKNXVNg==} + '@umijs/lint@4.4.10': + resolution: {integrity: sha512-1CGe+QOrfRhwzvvs3R6o6yf5Oez7+KMwX1L9yR5ERufvElNlpckZ/eK6CF3l5OpxKhXdqdiRN3vDyAKySdr/Mg==} '@umijs/mako-darwin-arm64@0.9.6': resolution: {integrity: sha512-AvYzWOornkq4LUio4RSMWmWwjceyH1CTNzyia85RYYLnjT+JaJZsJVF2R9CyFSDaaM80uoQLihCB2u/Tl87BQg==} @@ -4298,6 +4388,9 @@ packages: '@umijs/utils@4.3.34': resolution: {integrity: sha512-O0/6roQIstdxswvvdPXFxR+sP1yLtQP0yZaUjZbfVLvBuLPqE2hhij+tw3lOymFdumJ9nL+ZF4Uty67MMHPXKw==} + '@umijs/utils@4.4.10': + resolution: {integrity: sha512-/sgImv56UxvcrQV5l2MCnyAm+khw4Th71P52mbXO0XA+AJMa/auHs9BTyH7zZpit/uvH0Os7y6Shr1QXVj5tbw==} + '@umijs/utils@4.4.6': resolution: {integrity: sha512-W273HinahK0ZmfYQ/x8GsgS9ZMCknLB9ID+6sQhPoiA1ARKmD3RYD0ZHrboz19fILD4amFqeAYaF22rLuyz7OQ==} @@ -6327,8 +6420,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.23.0: - resolution: {integrity: sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==} + eslint@9.26.0: + resolution: {integrity: sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -7943,8 +8036,8 @@ packages: kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - kuzu-wasm@0.8.2: - resolution: {integrity: sha512-2XS0FCCyl+lGv1qymHq0I448k+brqyIi21VB6sxv6LJUpEo6UWolJEDjzSgYb1JE9wrV+313yWSTs4sCsbKRsA==} + kuzu-wasm@0.10.0: + resolution: {integrity: sha512-k4EhB0c16JszZokOZ5uQl//P8cw9WlX03ZJVuOC+eMdT2+/nSa8hBoELh/9U1Ag5bpLCyqUv41+GcCfMKyQLFQ==} latest-version@3.1.0: resolution: {integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==} @@ -9331,6 +9424,10 @@ packages: resolution: {integrity: sha512-ZBmhE1C9LcPoH9XZSdwiPtbPHZROwAnMy+kIFQVrnMCxY4Cudlz3gBOpzilgc0jOgRaiT3sIWfpMomW2ar2orQ==} engines: {node: '>=16.20.0'} + pkce-challenge@5.0.0: + resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} + engines: {node: '>=16.20.0'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -12857,11 +12954,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.23.3(@babel/core@7.23.6)(eslint@9.23.0)': + '@babel/eslint-parser@7.23.3(@babel/core@7.23.6)(eslint@9.26.0)': dependencies: '@babel/core': 7.23.6 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 9.23.0 + eslint: 9.26.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 @@ -13453,6 +13550,31 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} + '@dnd-kit/accessibility@3.1.1(react@18.2.0)': + dependencies: + react: 18.2.0 + tslib: 2.8.1 + + '@dnd-kit/core@6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + dependencies: + '@dnd-kit/accessibility': 3.1.1(react@18.2.0) + '@dnd-kit/utilities': 3.2.2(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.8.1 + + '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(react@18.2.0)': + dependencies: + '@dnd-kit/core': 6.3.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@dnd-kit/utilities': 3.2.2(react@18.2.0) + react: 18.2.0 + tslib: 2.8.1 + + '@dnd-kit/utilities@3.2.2(react@18.2.0)': + dependencies: + react: 18.2.0 + tslib: 2.8.1 + '@emnapi/runtime@1.3.1': dependencies: tslib: 2.8.1 @@ -13913,24 +14035,24 @@ snapshots: '@esbuild/win32-x64@0.25.2': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.23.0)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.26.0)': dependencies: - eslint: 9.23.0 + eslint: 9.26.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.19.2': + '@eslint/config-array@0.20.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.2.0': {} + '@eslint/config-helpers@0.2.2': {} - '@eslint/core@0.12.0': + '@eslint/core@0.13.0': dependencies: '@types/json-schema': 7.0.15 @@ -13948,13 +14070,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.23.0': {} + '@eslint/js@9.26.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.7': + '@eslint/plugin-kit@0.2.8': dependencies: - '@eslint/core': 0.12.0 + '@eslint/core': 0.13.0 levn: 0.4.1 '@floating-ui/core@0.6.2': {} @@ -14020,6 +14142,18 @@ snapshots: dependencies: tslib: 2.8.1 + '@formatjs/intl@2.10.15(typescript@5.3.3)': + dependencies: + '@formatjs/ecma402-abstract': 2.2.4 + '@formatjs/fast-memoize': 2.2.3 + '@formatjs/icu-messageformat-parser': 2.9.4 + '@formatjs/intl-displaynames': 6.8.5 + '@formatjs/intl-listformat': 7.7.5 + intl-messageformat: 10.7.7 + tslib: 2.8.1 + optionalDependencies: + typescript: 5.3.3 + '@formatjs/intl@2.10.15(typescript@5.6.3)': dependencies: '@formatjs/ecma402-abstract': 2.2.4 @@ -14237,7 +14371,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.13.14 + '@types/node': 22.15.17 '@types/yargs': 16.0.9 chalk: 4.1.2 @@ -14246,7 +14380,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.13.14 + '@types/node': 22.15.17 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -14296,7 +14430,7 @@ snapshots: '@loadable/component@5.15.2(react@18.2.0)': dependencies: - '@babel/runtime': 7.23.6 + '@babel/runtime': 7.27.0 hoist-non-react-statics: 3.3.2 react: 18.2.0 react-is: 16.13.1 @@ -14351,45 +14485,20 @@ snapshots: '@types/react': 18.2.0 react: 18.2.0 - '@microsoft/api-extractor-model@7.28.4(@types/node@22.13.14)': - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.63.0(@types/node@22.13.14) - transitivePeerDependencies: - - '@types/node' - - '@microsoft/api-extractor-model@7.28.4(@types/node@22.14.1)': + '@microsoft/api-extractor-model@7.28.4(@types/node@22.15.17)': dependencies: '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.63.0(@types/node@22.14.1) + '@rushstack/node-core-library': 3.63.0(@types/node@22.15.17) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.39.1(@types/node@22.13.14)': + '@microsoft/api-extractor@7.39.1(@types/node@22.15.17)': dependencies: - '@microsoft/api-extractor-model': 7.28.4(@types/node@22.13.14) + '@microsoft/api-extractor-model': 7.28.4(@types/node@22.15.17) '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.63.0(@types/node@22.13.14) - '@rushstack/rig-package': 0.5.1 - '@rushstack/ts-command-line': 4.17.1 - colors: 1.2.5 - lodash: 4.17.21 - resolve: 1.22.8 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.3.3 - transitivePeerDependencies: - - '@types/node' - - '@microsoft/api-extractor@7.39.1(@types/node@22.14.1)': - dependencies: - '@microsoft/api-extractor-model': 7.28.4(@types/node@22.14.1) - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.63.0(@types/node@22.14.1) + '@rushstack/node-core-library': 3.63.0(@types/node@22.15.17) '@rushstack/rig-package': 0.5.1 '@rushstack/ts-command-line': 4.17.1 colors: 1.2.5 @@ -14410,6 +14519,21 @@ snapshots: '@microsoft/tsdoc@0.14.2': {} + '@modelcontextprotocol/sdk@1.11.2': + dependencies: + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.5 + express: 5.0.1 + express-rate-limit: 7.5.0(express@5.0.1) + pkce-challenge: 5.0.0 + raw-body: 3.0.0 + zod: 3.24.2 + zod-to-json-schema: 3.24.3(zod@3.24.2) + transitivePeerDependencies: + - supports-color + '@modelcontextprotocol/sdk@1.6.1': dependencies: content-type: 1.0.5 @@ -14807,7 +14931,7 @@ snapshots: '@rc-component/trigger@1.18.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.27.0 '@rc-component/portal': 1.1.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 rc-motion: 2.9.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -14971,19 +15095,7 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.38.0': optional: true - '@rushstack/node-core-library@3.63.0(@types/node@22.13.14)': - dependencies: - colors: 1.2.5 - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.8 - semver: 7.5.4 - z-schema: 5.0.5 - optionalDependencies: - '@types/node': 22.13.14 - - '@rushstack/node-core-library@3.63.0(@types/node@22.14.1)': + '@rushstack/node-core-library@3.63.0(@types/node@22.15.17)': dependencies: colors: 1.2.5 fs-extra: 7.0.1 @@ -14993,7 +15105,7 @@ snapshots: semver: 7.5.4 z-schema: 5.0.5 optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 22.15.17 '@rushstack/rig-package@0.5.1': dependencies: @@ -15281,7 +15393,7 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.13.10 + '@types/node': 22.15.17 '@types/command-line-args@5.2.3': {} @@ -15289,7 +15401,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 22.13.10 + '@types/node': 22.15.17 '@types/d3-array@3.2.1': {} @@ -15434,7 +15546,7 @@ snapshots: '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 22.13.10 + '@types/node': 22.15.17 '@types/qs': 6.9.18 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -15449,13 +15561,13 @@ snapshots: '@types/fs-extra@11.0.1': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 22.13.14 + '@types/node': 22.15.17 '@types/geojson@7946.0.14': {} '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.14.1 + '@types/node': 22.15.17 '@types/hapi__joi@17.1.9': {} @@ -15497,13 +15609,13 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 22.13.14 + '@types/node': 22.15.17 '@types/katex@0.16.7': {} '@types/keyv@3.1.4': dependencies: - '@types/node': 22.14.1 + '@types/node': 22.15.17 '@types/lodash@4.17.13': {} @@ -15535,11 +15647,7 @@ snapshots: dependencies: undici-types: 6.20.0 - '@types/node@22.13.14': - dependencies: - undici-types: 6.20.0 - - '@types/node@22.14.1': + '@types/node@22.15.17': dependencies: undici-types: 6.21.0 @@ -15588,11 +15696,11 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 22.14.1 + '@types/node': 22.15.17 '@types/sax@1.2.7': dependencies: - '@types/node': 22.13.14 + '@types/node': 22.15.17 '@types/scheduler@0.23.0': {} @@ -15601,12 +15709,12 @@ snapshots: '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.13.10 + '@types/node': 22.15.17 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 22.13.10 + '@types/node': 22.15.17 '@types/send': 0.17.4 '@types/unist@2.0.11': {} @@ -15631,15 +15739,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.6.3))(eslint@9.23.0)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@5.6.3))(eslint@9.26.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@9.23.0)(typescript@5.6.3) + '@typescript-eslint/parser': 5.62.0(eslint@9.26.0)(typescript@5.6.3) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@9.23.0)(typescript@5.6.3) - '@typescript-eslint/utils': 5.62.0(eslint@9.23.0)(typescript@5.6.3) + '@typescript-eslint/type-utils': 5.62.0(eslint@9.26.0)(typescript@5.6.3) + '@typescript-eslint/utils': 5.62.0(eslint@9.26.0)(typescript@5.6.3) debug: 4.3.7(supports-color@5.5.0) - eslint: 9.23.0 + eslint: 9.26.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare-lite: 1.4.0 @@ -15650,15 +15758,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@5.8.2))(eslint@9.26.0)(typescript@5.8.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/parser': 5.62.0(eslint@9.26.0)(typescript@5.8.2) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@9.23.0)(typescript@5.8.2) - '@typescript-eslint/utils': 5.62.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/type-utils': 5.62.0(eslint@9.26.0)(typescript@5.8.2) + '@typescript-eslint/utils': 5.62.0(eslint@9.26.0)(typescript@5.8.2) debug: 4.3.7(supports-color@5.5.0) - eslint: 9.23.0 + eslint: 9.26.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare-lite: 1.4.0 @@ -15669,25 +15777,25 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.6.3)': + '@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) debug: 4.3.7(supports-color@5.5.0) - eslint: 9.23.0 + eslint: 9.26.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2)': + '@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@5.8.2)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.2) debug: 4.3.7(supports-color@5.5.0) - eslint: 9.23.0 + eslint: 9.26.0 optionalDependencies: typescript: 5.8.2 transitivePeerDependencies: @@ -15698,24 +15806,24 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/type-utils@5.62.0(eslint@9.23.0)(typescript@5.6.3)': + '@typescript-eslint/type-utils@5.62.0(eslint@9.26.0)(typescript@5.6.3)': dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) - '@typescript-eslint/utils': 5.62.0(eslint@9.23.0)(typescript@5.6.3) + '@typescript-eslint/utils': 5.62.0(eslint@9.26.0)(typescript@5.6.3) debug: 4.3.7(supports-color@5.5.0) - eslint: 9.23.0 + eslint: 9.26.0 tsutils: 3.21.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@5.62.0(eslint@9.23.0)(typescript@5.8.2)': + '@typescript-eslint/type-utils@5.62.0(eslint@9.26.0)(typescript@5.8.2)': dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.2) - '@typescript-eslint/utils': 5.62.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/utils': 5.62.0(eslint@9.26.0)(typescript@5.8.2) debug: 4.3.7(supports-color@5.5.0) - eslint: 9.23.0 + eslint: 9.26.0 tsutils: 3.21.0(typescript@5.8.2) optionalDependencies: typescript: 5.8.2 @@ -15752,30 +15860,30 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@9.23.0)(typescript@5.6.3)': + '@typescript-eslint/utils@5.62.0(eslint@9.26.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.23.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.26.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.6.3) - eslint: 9.23.0 + eslint: 9.26.0 eslint-scope: 5.1.1 semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@5.62.0(eslint@9.23.0)(typescript@5.8.2)': + '@typescript-eslint/utils@5.62.0(eslint@9.26.0)(typescript@5.8.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.23.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.26.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.2) - eslint: 9.23.0 + eslint: 9.26.0 eslint-scope: 5.1.1 semver: 7.6.3 transitivePeerDependencies: @@ -15836,12 +15944,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@umijs/babel-preset-umi@4.4.6': + '@umijs/babel-preset-umi@4.4.10': dependencies: '@babel/runtime': 7.23.6 '@bloomberg/record-tuple-polyfill': 0.0.4 - '@umijs/bundler-utils': 4.4.6 - '@umijs/utils': 4.4.6 + '@umijs/bundler-utils': 4.4.10 + '@umijs/utils': 4.4.10 core-js: 3.34.0 transitivePeerDependencies: - supports-color @@ -15859,7 +15967,7 @@ snapshots: '@umijs/bundler-mako@0.9.6': dependencies: - '@umijs/bundler-utils': 4.3.34 + '@umijs/bundler-utils': 4.4.6 '@umijs/mako': 0.9.6 chalk: 4.1.2 compression: 1.7.5 @@ -15884,6 +15992,16 @@ snapshots: transitivePeerDependencies: - supports-color + '@umijs/bundler-utils@4.4.10': + dependencies: + '@umijs/utils': 4.4.10 + esbuild: 0.21.4 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.1 + spdy: 4.0.2 + transitivePeerDependencies: + - supports-color + '@umijs/bundler-utils@4.4.6': dependencies: '@umijs/utils': 4.4.6 @@ -15894,18 +16012,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@umijs/bundler-vite@4.3.34(@types/node@22.13.14)(lightningcss@1.22.1)(postcss@8.5.3)(rollup@3.29.5)(sass@1.81.0)(terser@5.36.0)': + '@umijs/bundler-vite@4.3.34(@types/node@22.15.17)(lightningcss@1.22.1)(postcss@8.5.3)(rollup@3.29.5)(sass@1.81.0)(terser@5.36.0)': dependencies: '@svgr/core': 6.5.1 '@umijs/bundler-utils': 4.3.34 '@umijs/utils': 4.3.34 - '@vitejs/plugin-react': 4.0.0(vite@4.5.2(@types/node@22.13.14)(less@4.1.3)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) + '@vitejs/plugin-react': 4.0.0(vite@4.5.2(@types/node@22.15.17)(less@4.1.3)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) core-js: 3.34.0 less: 4.1.3 postcss-preset-env: 7.5.0(postcss@8.5.3) rollup-plugin-visualizer: 5.9.0(rollup@3.29.5) systemjs: 6.15.1 - vite: 4.5.2(@types/node@22.13.14)(less@4.1.3)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) + vite: 4.5.2(@types/node@22.15.17)(less@4.1.3)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) transitivePeerDependencies: - '@types/node' - lightningcss @@ -15961,10 +16079,10 @@ snapshots: '@umijs/bundler-utils': 4.3.34 '@umijs/case-sensitive-paths-webpack-plugin': 1.0.1 '@umijs/mfsu': 4.3.34 - '@umijs/react-refresh-webpack-plugin': 0.5.11(react-refresh@0.14.0)(type-fest@1.4.0)(webpack@5.96.1(webpack-cli@5.1.4(webpack@5.96.1))) + '@umijs/react-refresh-webpack-plugin': 0.5.11(react-refresh@0.14.0)(type-fest@1.4.0)(webpack@5.96.1) '@umijs/utils': 4.3.34 cors: 2.8.5 - css-loader: 6.7.1(webpack@5.96.1(webpack-cli@5.1.4(webpack@5.96.1))) + css-loader: 6.7.1(webpack@5.96.1) es5-imcompatible-versions: 0.1.90 fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.3.3)(webpack@5.96.1(webpack-cli@5.1.4(webpack@5.96.1))) jest-worker: 29.4.3 @@ -15995,10 +16113,10 @@ snapshots: '@umijs/bundler-utils': 4.3.34 '@umijs/case-sensitive-paths-webpack-plugin': 1.0.1 '@umijs/mfsu': 4.3.34 - '@umijs/react-refresh-webpack-plugin': 0.5.11(react-refresh@0.14.0)(type-fest@1.4.0)(webpack@5.96.1(webpack-cli@5.1.4(webpack@5.96.1))) + '@umijs/react-refresh-webpack-plugin': 0.5.11(react-refresh@0.14.0)(type-fest@1.4.0)(webpack@5.96.1) '@umijs/utils': 4.3.34 cors: 2.8.5 - css-loader: 6.7.1(webpack@5.96.1(webpack-cli@5.1.4(webpack@5.96.1))) + css-loader: 6.7.1(webpack@5.96.1) es5-imcompatible-versions: 0.1.90 fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.2)(webpack@5.96.1) jest-worker: 29.4.3 @@ -16071,20 +16189,20 @@ snapshots: '@umijs/history@5.3.1': dependencies: - '@babel/runtime': 7.23.6 + '@babel/runtime': 7.27.0 query-string: 6.14.1 - '@umijs/lint@4.3.34(eslint@9.23.0)(stylelint@14.16.1)(typescript@5.8.2)': + '@umijs/lint@4.3.34(eslint@9.26.0)(stylelint@14.16.1)(typescript@5.8.2)': dependencies: '@babel/core': 7.23.6 - '@babel/eslint-parser': 7.23.3(@babel/core@7.23.6)(eslint@9.23.0) + '@babel/eslint-parser': 7.23.3(@babel/core@7.23.6)(eslint@9.26.0) '@stylelint/postcss-css-in-js': 0.38.0(postcss-syntax@0.36.2(postcss@8.5.3))(postcss@8.5.3) - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2) - '@typescript-eslint/parser': 5.62.0(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@5.8.2))(eslint@9.26.0)(typescript@5.8.2) + '@typescript-eslint/parser': 5.62.0(eslint@9.26.0)(typescript@5.8.2) '@umijs/babel-preset-umi': 4.3.34 - eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2) - eslint-plugin-react: 7.33.2(eslint@9.23.0) - eslint-plugin-react-hooks: 4.6.0(eslint@9.23.0) + eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@5.8.2))(eslint@9.26.0)(typescript@5.8.2))(eslint@9.26.0)(typescript@5.8.2) + eslint-plugin-react: 7.33.2(eslint@9.26.0) + eslint-plugin-react-hooks: 4.6.0(eslint@9.26.0) postcss: 8.5.3 postcss-syntax: 0.36.2(postcss@8.5.3) stylelint-config-standard: 25.0.0(stylelint@14.16.1) @@ -16100,17 +16218,17 @@ snapshots: - supports-color - typescript - '@umijs/lint@4.4.6(eslint@9.23.0)(stylelint@14.16.1)(typescript@5.6.3)': + '@umijs/lint@4.4.10(eslint@9.26.0)(stylelint@14.16.1)(typescript@5.6.3)': dependencies: '@babel/core': 7.23.6 - '@babel/eslint-parser': 7.23.3(@babel/core@7.23.6)(eslint@9.23.0) + '@babel/eslint-parser': 7.23.3(@babel/core@7.23.6)(eslint@9.26.0) '@stylelint/postcss-css-in-js': 0.38.0(postcss-syntax@0.36.2(postcss@8.4.49))(postcss@8.4.49) - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.6.3))(eslint@9.23.0)(typescript@5.6.3) - '@typescript-eslint/parser': 5.62.0(eslint@9.23.0)(typescript@5.6.3) - '@umijs/babel-preset-umi': 4.4.6 - eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.6.3))(eslint@9.23.0)(typescript@5.6.3))(eslint@9.23.0)(typescript@5.6.3) - eslint-plugin-react: 7.33.2(eslint@9.23.0) - eslint-plugin-react-hooks: 4.6.0(eslint@9.23.0) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@5.6.3))(eslint@9.26.0)(typescript@5.6.3) + '@typescript-eslint/parser': 5.62.0(eslint@9.26.0)(typescript@5.6.3) + '@umijs/babel-preset-umi': 4.4.10 + eslint-plugin-jest: 27.2.3(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@5.6.3))(eslint@9.26.0)(typescript@5.6.3))(eslint@9.26.0)(typescript@5.6.3) + eslint-plugin-react: 7.33.2(eslint@9.26.0) + eslint-plugin-react-hooks: 4.6.0(eslint@9.26.0) postcss: 8.4.49 postcss-syntax: 0.36.2(postcss@8.4.49) stylelint-config-standard: 25.0.0(stylelint@14.16.1) @@ -16189,7 +16307,7 @@ snapshots: dependencies: tsx: 3.12.2 - '@umijs/preset-umi@4.3.34(@types/node@22.13.14)(@types/react@18.2.0)(lightningcss@1.22.1)(rollup@3.29.5)(sass@1.81.0)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1)': + '@umijs/preset-umi@4.3.34(@types/node@22.15.17)(@types/react@18.2.0)(lightningcss@1.22.1)(rollup@3.29.5)(sass@1.81.0)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1)': dependencies: '@iconify/utils': 2.1.1 '@svgr/core': 6.5.1 @@ -16198,7 +16316,7 @@ snapshots: '@umijs/bundler-esbuild': 4.3.34 '@umijs/bundler-mako': 0.9.6 '@umijs/bundler-utils': 4.3.34 - '@umijs/bundler-vite': 4.3.34(@types/node@22.13.14)(lightningcss@1.22.1)(postcss@8.5.3)(rollup@3.29.5)(sass@1.81.0)(terser@5.36.0) + '@umijs/bundler-vite': 4.3.34(@types/node@22.15.17)(lightningcss@1.22.1)(postcss@8.5.3)(rollup@3.29.5)(sass@1.81.0)(terser@5.36.0) '@umijs/bundler-webpack': 4.3.34(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1) '@umijs/core': 4.3.34 '@umijs/did-you-know': 1.0.3 @@ -16263,7 +16381,7 @@ snapshots: optionalDependencies: type-fest: 1.4.0 - '@umijs/react-refresh-webpack-plugin@0.5.11(react-refresh@0.14.0)(type-fest@1.4.0)(webpack@5.96.1(webpack-cli@5.1.4(webpack@5.96.1)))': + '@umijs/react-refresh-webpack-plugin@0.5.11(react-refresh@0.14.0)(type-fest@1.4.0)(webpack@5.96.1)': dependencies: ansi-html-community: 0.0.8 common-path-prefix: 3.0.0 @@ -16320,6 +16438,11 @@ snapshots: chokidar: 3.5.3 pino: 7.11.0 + '@umijs/utils@4.4.10': + dependencies: + chokidar: 3.5.3 + pino: 7.11.0 + '@umijs/utils@4.4.6': dependencies: chokidar: 3.5.3 @@ -16331,24 +16454,24 @@ snapshots: '@vercel/ncc@0.33.3': {} - '@vitejs/plugin-react@4.0.0(vite@4.5.2(@types/node@22.13.14)(less@4.1.3)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0))': + '@vitejs/plugin-react@4.0.0(vite@4.5.2(@types/node@22.15.17)(less@4.1.3)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) react-refresh: 0.14.2 - vite: 4.5.2(@types/node@22.13.14)(less@4.1.3)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) + vite: 4.5.2(@types/node@22.15.17)(less@4.1.3)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.3.3(vite@5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0))': + '@vitejs/plugin-react@4.3.3(vite@5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) + vite: 5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) transitivePeerDependencies: - supports-color @@ -16363,14 +16486,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.3.4(vite@6.2.4(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)(yaml@2.5.1))': + '@vitejs/plugin-react@4.3.4(vite@6.2.4(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)(yaml@2.5.1))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 6.2.4(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)(yaml@2.5.1) + vite: 6.2.4(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)(yaml@2.5.1) transitivePeerDependencies: - supports-color @@ -16381,13 +16504,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.5(vite@5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0))': + '@vitest/mocker@2.1.5(vite@5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0))': dependencies: '@vitest/spy': 2.1.5 estree-walker: 3.0.3 magic-string: 0.30.13 optionalDependencies: - vite: 5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) + vite: 5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) '@vitest/pretty-format@2.1.5': dependencies: @@ -16927,7 +17050,7 @@ snapshots: babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.26.0 + '@babel/runtime': 7.27.0 cosmiconfig: 7.1.0 resolve: 1.22.8 @@ -17862,7 +17985,7 @@ snapshots: semver: 7.6.3 webpack: 5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.96.1)) - css-loader@6.7.1(webpack@5.96.1(webpack-cli@5.1.4(webpack@5.96.1))): + css-loader@6.7.1(webpack@5.96.1): dependencies: icss-utils: 5.1.0(postcss@8.5.3) postcss: 8.5.3 @@ -18425,7 +18548,7 @@ snapshots: dumi-assets-types@2.4.14: {} - dumi-theme-antd@0.4.2(@babel/core@7.26.0)(@types/react@18.2.0)(antd@5.22.2(date-fns@2.30.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(date-fns@2.30.0)(dumi@2.4.14(@babel/core@7.26.0)(@swc/helpers@0.5.15)(@types/node@22.13.14)(@types/react@18.2.0)(eslint@9.23.0)(lightningcss@1.22.1)(prettier@3.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@3.29.5)(stylelint@14.16.1)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1))(immer@10.1.1)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0): + dumi-theme-antd@0.4.2(@babel/core@7.26.0)(@types/react@18.2.0)(antd@5.22.2(date-fns@2.30.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0))(date-fns@2.30.0)(dumi@2.4.14(@babel/core@7.26.0)(@swc/helpers@0.5.15)(@types/node@22.15.17)(@types/react@18.2.0)(eslint@9.26.0)(lightningcss@1.22.1)(prettier@3.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@3.29.5)(stylelint@14.16.1)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1))(immer@10.1.1)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0): dependencies: '@ant-design/cssinjs': 1.20.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@ant-design/icons': 5.3.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -18438,7 +18561,7 @@ snapshots: antd-token-previewer: 2.0.0-alpha.6(@babel/core@7.26.0)(@types/react@18.2.0)(date-fns@2.30.0)(immer@10.1.1)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0) classnames: 2.3.2 dayjs: 1.11.7 - dumi: 2.4.14(@babel/core@7.26.0)(@swc/helpers@0.5.15)(@types/node@22.13.14)(@types/react@18.2.0)(eslint@9.23.0)(lightningcss@1.22.1)(prettier@3.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@3.29.5)(stylelint@14.16.1)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1) + dumi: 2.4.14(@babel/core@7.26.0)(@swc/helpers@0.5.15)(@types/node@22.15.17)(@types/react@18.2.0)(eslint@9.26.0)(lightningcss@1.22.1)(prettier@3.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@3.29.5)(stylelint@14.16.1)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1) lodash.clonedeep: 4.5.0 prism-react-renderer: 2.4.0(react@18.2.0) rc-drawer: 6.2.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -18457,7 +18580,7 @@ snapshots: - react-is - supports-color - dumi@2.4.14(@babel/core@7.26.0)(@swc/helpers@0.5.15)(@types/node@22.13.14)(@types/react@18.2.0)(eslint@9.23.0)(lightningcss@1.22.1)(prettier@3.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@3.29.5)(stylelint@14.16.1)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1): + dumi@2.4.14(@babel/core@7.26.0)(@swc/helpers@0.5.15)(@types/node@22.15.17)(@types/react@18.2.0)(eslint@9.26.0)(lightningcss@1.22.1)(prettier@3.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@3.29.5)(stylelint@14.16.1)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1): dependencies: '@ant-design/icons-svg': 4.4.2 '@makotot/ghostui': 2.0.0(react@18.2.0) @@ -18522,7 +18645,7 @@ snapshots: sass: 1.81.0 sitemap: 7.1.2 sucrase: 3.35.0 - umi: 4.3.34(@babel/core@7.26.0)(@types/node@22.13.14)(@types/react@18.2.0)(eslint@9.23.0)(lightningcss@1.22.1)(prettier@3.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@3.29.5)(sass@1.81.0)(stylelint@14.16.1)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1) + umi: 4.3.34(@babel/core@7.26.0)(@types/node@22.15.17)(@types/react@18.2.0)(eslint@9.26.0)(lightningcss@1.22.1)(prettier@3.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@3.29.5)(sass@1.81.0)(stylelint@14.16.1)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1) unified: 10.1.2 unist-util-visit: 4.1.2 unist-util-visit-parents: 5.1.3 @@ -18946,38 +19069,38 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.6.3))(eslint@9.23.0)(typescript@5.6.3))(eslint@9.23.0)(typescript@5.6.3): + eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@5.6.3))(eslint@9.26.0)(typescript@5.6.3))(eslint@9.26.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@9.23.0)(typescript@5.6.3) - eslint: 9.23.0 + '@typescript-eslint/utils': 5.62.0(eslint@9.26.0)(typescript@5.6.3) + eslint: 9.26.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.6.3))(eslint@9.23.0)(typescript@5.6.3) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@5.6.3))(eslint@9.26.0)(typescript@5.6.3) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2): + eslint-plugin-jest@27.2.3(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@5.8.2))(eslint@9.26.0)(typescript@5.8.2))(eslint@9.26.0)(typescript@5.8.2): dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@9.23.0)(typescript@5.8.2) - eslint: 9.23.0 + '@typescript-eslint/utils': 5.62.0(eslint@9.26.0)(typescript@5.8.2) + eslint: 9.26.0 optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.26.0)(typescript@5.8.2))(eslint@9.26.0)(typescript@5.8.2) transitivePeerDependencies: - supports-color - typescript - eslint-plugin-react-hooks@4.6.0(eslint@9.23.0): + eslint-plugin-react-hooks@4.6.0(eslint@9.26.0): dependencies: - eslint: 9.23.0 + eslint: 9.26.0 - eslint-plugin-react@7.33.2(eslint@9.23.0): + eslint-plugin-react@7.33.2(eslint@9.26.0): dependencies: array-includes: 3.1.8 array.prototype.flatmap: 1.3.2 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.0 - eslint: 9.23.0 + eslint: 9.26.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 @@ -19006,19 +19129,20 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.23.0: + eslint@9.26.0: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.23.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.26.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.19.2 - '@eslint/config-helpers': 0.2.0 - '@eslint/core': 0.12.0 + '@eslint/config-array': 0.20.0 + '@eslint/config-helpers': 0.2.2 + '@eslint/core': 0.13.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.23.0 - '@eslint/plugin-kit': 0.2.7 + '@eslint/js': 9.26.0 + '@eslint/plugin-kit': 0.2.8 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.2 + '@modelcontextprotocol/sdk': 1.11.2 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -19043,6 +19167,7 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 + zod: 3.24.2 transitivePeerDependencies: - supports-color @@ -19331,47 +19456,9 @@ snapshots: dependencies: reusify: 1.0.4 - father@4.5.1(@babel/core@7.26.0)(@types/node@22.13.14)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0))(type-fest@1.4.0)(webpack@5.96.1): - dependencies: - '@microsoft/api-extractor': 7.39.1(@types/node@22.13.14) - '@umijs/babel-preset-umi': 4.3.34 - '@umijs/bundler-utils': 4.3.34 - '@umijs/bundler-webpack': 4.3.34(type-fest@1.4.0)(typescript@5.3.3)(webpack@5.96.1(webpack-cli@5.1.4(webpack@5.96.1))) - '@umijs/case-sensitive-paths-webpack-plugin': 1.0.1 - '@umijs/core': 4.3.34 - '@umijs/utils': 4.3.34 - '@vercel/ncc': 0.33.3 - babel-plugin-dynamic-import-node: 2.3.3 - babel-plugin-module-resolver: 4.1.0 - babel-plugin-styled-components: 2.1.4(@babel/core@7.26.0)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0))(supports-color@5.5.0) - babel-plugin-transform-define: 2.0.1 - enhanced-resolve: 5.9.3 - esbuild: 0.17.19 - fast-glob: 3.2.12 - file-system-cache: 2.0.0 - loader-runner: 4.2.0 - minimatch: 3.1.2 - piscina: 4.7.0 - tsconfig-paths: 4.0.0 - typescript: 5.3.3 - typescript-transform-paths: 3.4.6(typescript@5.3.3) - v8-compile-cache: 2.3.0 - transitivePeerDependencies: - - '@babel/core' - - '@types/node' - - '@types/webpack' - - sockjs-client - - styled-components - - supports-color - - type-fest - - webpack - - webpack-dev-server - - webpack-hot-middleware - - webpack-plugin-serve - - father@4.5.1(@babel/core@7.26.0)(@types/node@22.14.1)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0))(type-fest@1.4.0)(webpack@5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.96.1))): + father@4.5.1(@babel/core@7.26.0)(@types/node@22.15.17)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0))(type-fest@1.4.0)(webpack@5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.96.1))): dependencies: - '@microsoft/api-extractor': 7.39.1(@types/node@22.14.1) + '@microsoft/api-extractor': 7.39.1(@types/node@22.15.17) '@umijs/babel-preset-umi': 4.3.34 '@umijs/bundler-utils': 4.3.34 '@umijs/bundler-webpack': 4.3.34(type-fest@1.4.0)(typescript@5.3.3)(webpack@5.96.1(@swc/core@1.9.2(@swc/helpers@0.5.15))(webpack-cli@5.1.4(webpack@5.96.1))) @@ -19407,9 +19494,9 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - father@4.5.1(@babel/core@7.26.0)(@types/node@22.14.1)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0))(type-fest@1.4.0)(webpack@5.96.1(webpack-cli@5.1.4(webpack@5.96.1))): + father@4.5.1(@babel/core@7.26.0)(@types/node@22.15.17)(styled-components@5.3.11(@babel/core@7.26.0)(react-dom@18.2.0(react@18.2.0))(react-is@18.3.1)(react@18.2.0))(type-fest@1.4.0)(webpack@5.96.1): dependencies: - '@microsoft/api-extractor': 7.39.1(@types/node@22.14.1) + '@microsoft/api-extractor': 7.39.1(@types/node@22.15.17) '@umijs/babel-preset-umi': 4.3.34 '@umijs/bundler-utils': 4.3.34 '@umijs/bundler-webpack': 4.3.34(type-fest@1.4.0)(typescript@5.3.3)(webpack@5.96.1(webpack-cli@5.1.4(webpack@5.96.1))) @@ -19878,7 +19965,7 @@ snapshots: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0 fs-extra: 11.2.0 transitivePeerDependencies: - supports-color @@ -20354,7 +20441,7 @@ snapshots: history@5.3.0: dependencies: - '@babel/runtime': 7.23.6 + '@babel/runtime': 7.27.0 hmac-drbg@1.0.1: dependencies: @@ -20982,7 +21069,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 22.14.1 + '@types/node': 22.15.17 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -20999,7 +21086,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.13.14 + '@types/node': 22.15.17 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -21007,20 +21094,20 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.14.1 + '@types/node': 22.15.17 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.4.3: dependencies: - '@types/node': 22.13.14 + '@types/node': 22.15.17 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 22.14.1 + '@types/node': 22.15.17 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -21144,7 +21231,7 @@ snapshots: kolorist@1.8.0: {} - kuzu-wasm@0.8.2: + kuzu-wasm@0.10.0: dependencies: threads: 1.7.0 tiny-worker: 2.3.0 @@ -23140,6 +23227,8 @@ snapshots: pkce-challenge@4.1.0: {} + pkce-challenge@5.0.0: {} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -24081,7 +24170,7 @@ snapshots: react-helmet-async@1.3.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime': 7.23.6 + '@babel/runtime': 7.27.0 invariant: 2.2.4 prop-types: 15.8.1 react: 18.2.0 @@ -24102,6 +24191,22 @@ snapshots: optionalDependencies: react-dom: 18.2.0(react@18.2.0) + react-intl@6.8.9(react@18.2.0)(typescript@5.3.3): + dependencies: + '@formatjs/ecma402-abstract': 2.2.4 + '@formatjs/icu-messageformat-parser': 2.9.4 + '@formatjs/intl': 2.10.15(typescript@5.3.3) + '@formatjs/intl-displaynames': 6.8.5 + '@formatjs/intl-listformat': 7.7.5 + '@types/hoist-non-react-statics': 3.3.5 + '@types/react': 18.2.0 + hoist-non-react-statics: 3.3.2 + intl-messageformat: 10.7.7 + react: 18.2.0 + tslib: 2.8.1 + optionalDependencies: + typescript: 5.3.3 + react-intl@6.8.9(react@18.2.0)(typescript@5.6.3): dependencies: '@formatjs/ecma402-abstract': 2.2.4 @@ -25076,7 +25181,7 @@ snapshots: spdy-transport@3.0.0: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.4.0 detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -25868,14 +25973,14 @@ snapshots: dependencies: '@lukeed/csprng': 1.1.0 - umi@4.3.34(@babel/core@7.26.0)(@types/node@22.13.14)(@types/react@18.2.0)(eslint@9.23.0)(lightningcss@1.22.1)(prettier@3.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@3.29.5)(sass@1.81.0)(stylelint@14.16.1)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1): + umi@4.3.34(@babel/core@7.26.0)(@types/node@22.15.17)(@types/react@18.2.0)(eslint@9.26.0)(lightningcss@1.22.1)(prettier@3.3.3)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(rollup@3.29.5)(sass@1.81.0)(stylelint@14.16.1)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1): dependencies: '@babel/runtime': 7.23.6 '@umijs/bundler-utils': 4.3.34 '@umijs/bundler-webpack': 4.3.34(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1) '@umijs/core': 4.3.34 - '@umijs/lint': 4.3.34(eslint@9.23.0)(stylelint@14.16.1)(typescript@5.8.2) - '@umijs/preset-umi': 4.3.34(@types/node@22.13.14)(@types/react@18.2.0)(lightningcss@1.22.1)(rollup@3.29.5)(sass@1.81.0)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1) + '@umijs/lint': 4.3.34(eslint@9.26.0)(stylelint@14.16.1)(typescript@5.8.2) + '@umijs/preset-umi': 4.3.34(@types/node@22.15.17)(@types/react@18.2.0)(lightningcss@1.22.1)(rollup@3.29.5)(sass@1.81.0)(terser@5.36.0)(type-fest@1.4.0)(typescript@5.8.2)(webpack@5.96.1) '@umijs/renderer-react': 4.3.34(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@umijs/server': 4.3.34 '@umijs/test': 4.3.34(@babel/core@7.26.0) @@ -26254,13 +26359,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@2.1.5(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0): + vite-node@2.1.5(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0): dependencies: cac: 6.7.14 debug: 4.3.7(supports-color@5.5.0) es-module-lexer: 1.5.4 pathe: 1.1.2 - vite: 5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) + vite: 5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) transitivePeerDependencies: - '@types/node' - less @@ -26293,12 +26398,12 @@ snapshots: picocolors: 1.1.1 vite: 5.4.16(@types/node@22.9.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) - vite-plugin-top-level-await@1.4.4(@swc/helpers@0.5.15)(rollup@4.38.0)(vite@5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)): + vite-plugin-top-level-await@1.4.4(@swc/helpers@0.5.15)(rollup@4.38.0)(vite@5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)): dependencies: '@rollup/plugin-virtual': 3.0.2(rollup@4.38.0) '@swc/core': 1.9.2(@swc/helpers@0.5.15) uuid: 10.0.0 - vite: 5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) + vite: 5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) transitivePeerDependencies: - '@swc/helpers' - rollup @@ -26313,34 +26418,34 @@ snapshots: - '@swc/helpers' - rollup - vite-plugin-wasm@3.3.0(vite@5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)): + vite-plugin-wasm@3.3.0(vite@5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)): dependencies: - vite: 5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) + vite: 5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) vite-plugin-wasm@3.3.0(vite@5.4.16(@types/node@22.9.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)): dependencies: vite: 5.4.16(@types/node@22.9.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) - vite@4.5.2(@types/node@22.13.14)(less@4.1.3)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0): + vite@4.5.2(@types/node@22.15.17)(less@4.1.3)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0): dependencies: esbuild: 0.18.20 postcss: 8.5.3 rollup: 3.29.5 optionalDependencies: - '@types/node': 22.13.14 + '@types/node': 22.15.17 fsevents: 2.3.3 less: 4.1.3 lightningcss: 1.22.1 sass: 1.81.0 terser: 5.36.0 - vite@5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0): + vite@5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0): dependencies: esbuild: 0.21.5 postcss: 8.5.3 rollup: 4.38.0 optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 22.15.17 fsevents: 2.3.3 less: 4.2.0 lightningcss: 1.22.1 @@ -26360,13 +26465,13 @@ snapshots: sass: 1.81.0 terser: 5.36.0 - vite@6.2.4(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)(yaml@2.5.1): + vite@6.2.4(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)(yaml@2.5.1): dependencies: esbuild: 0.25.2 postcss: 8.5.3 rollup: 4.38.0 optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 22.15.17 fsevents: 2.3.3 less: 4.2.0 lightningcss: 1.22.1 @@ -26374,10 +26479,10 @@ snapshots: terser: 5.36.0 yaml: 2.5.1 - vitest@2.1.5(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0): + vitest@2.1.5(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0): dependencies: '@vitest/expect': 2.1.5 - '@vitest/mocker': 2.1.5(vite@5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) + '@vitest/mocker': 2.1.5(vite@5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0)) '@vitest/pretty-format': 2.1.5 '@vitest/runner': 2.1.5 '@vitest/snapshot': 2.1.5 @@ -26393,11 +26498,11 @@ snapshots: tinyexec: 0.3.1 tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.16(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) - vite-node: 2.1.5(@types/node@22.14.1)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) + vite: 5.4.16(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) + vite-node: 2.1.5(@types/node@22.15.17)(less@4.2.0)(lightningcss@1.22.1)(sass@1.81.0)(terser@5.36.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.14.1 + '@types/node': 22.15.17 transitivePeerDependencies: - less - lightningcss diff --git a/todo.md b/todo.md new file mode 100644 index 000000000..357394571 --- /dev/null +++ b/todo.md @@ -0,0 +1,12 @@ +目前 (Statement) 是固定垂直排列的、可以通过 React DnD 来实现拖拽排序; +添加全屏功能 (状态,按钮) +增删改查目前都有,可以优化 +将 QueryCell (Statement) 组件重构为独立的模块 +根据对 dnd-kit 的研究,实现一个 QueryCell 组件,添加展开、收起、排序和移动功能 + +header中搜索时添加一个statement不变、在app/content/index.tsx中添加dnd排序; +在statement中添加展开收起、全屏、在表格中添加复制粘贴导出等功能; +删除默认的 script 语句 +只在查询后显示 Result 内容 +改进全屏模式,让全屏按钮始终可见 +全屏模式只显示当前 QueryCell \ No newline at end of file From 7204a5dd38c9de7d4e0ea032509ba9164b80a509 Mon Sep 17 00:00:00 2001 From: xwj02155382 Date: Mon, 19 May 2025 09:47:00 +0800 Subject: [PATCH 2/2] fix: add datasource select sortable ... --- .../studio-query/src/app/content/header.tsx | 9 +- .../studio-query/src/app/content/index.tsx | 543 ++++++++-- .../studio-query/src/app/content/welcome.tsx | 615 +++++++++++- packages/studio-query/src/app/context.tsx | 28 + packages/studio-query/src/app/index.tsx | 42 +- .../components/QueryCell/GraphSelector.tsx | 131 +++ .../QueryCell/SortableQueryCell.tsx | 24 +- .../src/components/QueryCell/index.tsx | 924 +++++++++++++++++- .../src/components/cypher-editor/index.tsx | 31 +- packages/studio-query/src/locales/en-US.ts | 156 +++ packages/studio-query/src/locales/zh-CN.ts | 194 +++- .../src/statement/editor/index.tsx | 54 +- .../src/statement/editor/save.tsx | 88 +- packages/studio-query/src/statement/index.tsx | 4 +- .../result/RawTable/interanctive-table.tsx | 2 +- .../src/statement/result/index.tsx | 2 +- .../src/statement/result/table.tsx | 4 +- todo.md | 12 - 18 files changed, 2708 insertions(+), 155 deletions(-) create mode 100644 packages/studio-query/src/components/QueryCell/GraphSelector.tsx delete mode 100644 todo.md diff --git a/packages/studio-query/src/app/content/header.tsx b/packages/studio-query/src/app/content/header.tsx index a7f5e0d31..a7f70e313 100644 --- a/packages/studio-query/src/app/content/header.tsx +++ b/packages/studio-query/src/app/content/header.tsx @@ -1,6 +1,6 @@ import React, { useRef, useState, Suspense } from 'react'; import { InsertRowAboveOutlined, OrderedListOutlined } from '@ant-design/icons'; -import { Segmented, Space, Flex } from 'antd'; +import { Segmented, Space, Flex, theme } from 'antd'; import { IStudioQueryProps, localStorageVars } from '../context'; import { useContext } from '../context'; import { Utils } from '@graphscope/studio-components'; @@ -20,6 +20,8 @@ const options = [ { icon: , value: 'flow' }, ]; +const { useToken } = theme; + const ModeSwitch = () => { const { updateStore, store } = useContext(); const { mode } = store; @@ -72,12 +74,15 @@ const Header: React.FunctionComponent = props => { const { connectComponent, displaySidebarPosition } = props; const { store } = useContext(); const { language } = store; + const { token } = useToken(); return (
diff --git a/packages/studio-query/src/app/content/index.tsx b/packages/studio-query/src/app/content/index.tsx index 05f704f05..e495e35cf 100644 --- a/packages/studio-query/src/app/content/index.tsx +++ b/packages/studio-query/src/app/content/index.tsx @@ -5,10 +5,10 @@ const QueryCell = lazy(() => import('../../components/QueryCell')); const SortableQueryCell = lazy(() => import('../../components/QueryCell/SortableQueryCell')); // import Header from './header'; const Header = lazy(() => import('./header')); -import { Segmented, theme, Button, Flex } from 'antd'; -import { useContext } from '../context'; +import { Segmented, theme, Button, Flex, Tooltip, Modal } from 'antd'; +import { useContext, localStorageVars } from '../context'; import type { IStatement, IStudioQueryProps } from '../context'; -import { PlayCircleOutlined, PlusOutlined } from '@ant-design/icons'; +import { PlayCircleOutlined, PlusOutlined, HomeOutlined, ExclamationCircleOutlined } from '@ant-design/icons'; import Welcome from './welcome'; import Empty from './empty'; import { v4 as uuidv4 } from 'uuid'; @@ -22,7 +22,9 @@ import { useSensors } from '@dnd-kit/core'; import { arrayMove, SortableContext, sortableKeyboardCoordinates, verticalListSortingStrategy } from '@dnd-kit/sortable'; +import { FormattedMessage, useIntl } from 'react-intl'; +const { confirm } = Modal; type ModeType = 'tabs' | 'flow'; interface IContentProps { @@ -32,6 +34,8 @@ interface IContentProps { enableImmediateQuery: boolean; connectComponent?: IStudioQueryProps['connectComponent']; displaySidebarPosition?: IStudioQueryProps['displaySidebarPosition']; + queryGraphSchema?: IStudioQueryProps['queryGraphSchema']; + queryInfo?: IStudioQueryProps['queryInfo']; } const { useToken } = theme; @@ -43,11 +47,68 @@ const Content: React.FunctionComponent = props => { handleCancelQuery, connectComponent, displaySidebarPosition, + queryGraphSchema, + queryInfo, } = props; const { store, updateStore } = useContext(); - const { activeId, mode, statements, savedStatements, schemaData, graphId, language } = store; + const { + activeId, + mode, + statements, + savedStatements, + schemaData, + graphId, + language, + activeNotebook, + showWelcomePage + } = store; const savedIds = savedStatements.map(item => item.id); const { token } = useToken(); + const intl = useIntl(); + + // 保存可用的图数据源列表 + const [availableGraphs, setAvailableGraphs] = useState([]); + + // 获取所有可用的图数据源 + useEffect(() => { + const fetchGraphs = async () => { + try { + // 如果有可用的queryInfo API,使用它获取所有图数据源 + if (queryInfo) { + try { + // 获取当前图的信息 + const currentGraphInfo = await queryInfo(graphId); + const currentGraph = { + id: graphId, + name: currentGraphInfo?.graph_name || intl.formatMessage({ id: 'content.current.graph' }), + status: currentGraphInfo?.status || "ACTIVE" + }; + + // 这里应该还应该获取所有可用的图,但暂时我们只使用当前图 + // 实际实现应该通过API获取所有可用图列表 + setAvailableGraphs([currentGraph]); + } catch (error) { + console.error('Failed to fetch graph info:', error); + // 失败时使用默认图 + setAvailableGraphs([ + { id: graphId, name: intl.formatMessage({ id: 'content.current.graph' }), status: 'ACTIVE' } + ]); + } + } else { + // 没有API时使用默认值 + setAvailableGraphs([ + { id: graphId, name: intl.formatMessage({ id: 'content.current.graph' }), status: 'ACTIVE' } + ]); + } + } catch (error) { + console.error('Failed to fetch available graphs:', error); + } + }; + + if (graphId) { + fetchGraphs(); + } + }, [graphId, queryInfo, intl]); // 配置拖拽传感器 const sensors = useSensors( @@ -64,22 +125,23 @@ const Content: React.FunctionComponent = props => { // 添加状态以跟踪全屏状态 const [fullscreenId, setFullscreenId] = useState(null); - // 初始化时如果没有语句,添加一个默认的语句 - useEffect(() => { - if (statements.length === 0) { - const id = uuidv4(); - updateStore(draft => { - draft.statements = [ - { - id, - script: '', - language, - }, - ]; - draft.activeId = id; - }); - } - }, []); + // 初始化时不再自动添加语句,让Welcome组件处理 + // useEffect(() => { + // if (statements.length === 0) { + // const id = uuidv4(); + // updateStore(draft => { + // draft.statements = [ + // { + // id, + // script: '', + // language, + // graphId, + // }, + // ]; + // draft.activeId = id; + // }); + // } + // }, []); const statementStyles = mode === 'tabs' @@ -126,6 +188,9 @@ const Content: React.FunctionComponent = props => { return item.id !== id; }); draft.activeId = draft.statements[0] && draft.statements[0].id; + + // 保存到活动的笔记本 + updateNotebookStatements(draft); }); }; @@ -133,17 +198,127 @@ const Content: React.FunctionComponent = props => { const addNewCell = () => { const id = uuidv4(); updateStore(draft => { - draft.statements = [ - ...draft.statements, - { - id, - script: '', - language, - }, - ]; + const newStatement = { + id, + script: '', + language, + graphId, // 使用当前选中的graphId作为默认值 + }; + + draft.statements = [...draft.statements, newStatement]; draft.activeId = id; + + // 如果有活动的笔记本,更新笔记本中的语句 + if (draft.activeNotebook) { + draft.activeNotebook.statements = draft.statements; + draft.activeNotebook.updatedAt = Date.now(); + + // 更新notebooks数组中的对应笔记本 + const index = draft.notebooks.findIndex(n => n.id === draft.activeNotebook?.id); + if (index !== -1) { + draft.notebooks[index] = draft.activeNotebook; + + // 保存到本地存储 + try { + localStorage.setItem( + localStorageVars.notebooks, + JSON.stringify(draft.notebooks) + ); + } catch (error) { + console.error(intl.formatMessage({ id: 'content.save.notebooks.error' }), error); + } + } + } + }); + }; + + // 修改 handleMoveUp 方法,保存语句到当前笔记本 + const handleMoveUp = (id: string) => { + console.log('Moving cell up:', id); + updateStore(draft => { + const index = draft.statements.findIndex(item => item.id === id); + if (index > 0) { + // 交换当前单元格与上一个单元格的位置 + [draft.statements[index], draft.statements[index - 1]] = + [draft.statements[index - 1], draft.statements[index]]; + + // 确保移动后当前单元格仍然活跃 + draft.activeId = id; + console.log('Cell moved up, new index:', index - 1); + + // 保存到活动的笔记本 + updateNotebookStatements(draft); + } }); }; + + // 修改 handleMoveDown 方法,保存语句到当前笔记本 + const handleMoveDown = (id: string) => { + console.log('Moving cell down:', id); + updateStore(draft => { + const index = draft.statements.findIndex(item => item.id === id); + if (index >= 0 && index < draft.statements.length - 1) { + // 交换当前单元格与下一个单元格的位置 + [draft.statements[index], draft.statements[index + 1]] = + [draft.statements[index + 1], draft.statements[index]]; + + // 确保移动后当前单元格仍然活跃 + draft.activeId = id; + console.log('Cell moved down, new index:', index + 1); + + // 保存到活动的笔记本 + updateNotebookStatements(draft); + } + }); + }; + + // 辅助函数:更新笔记本中的语句并保存到本地存储 + const updateNotebookStatements = (draft: any) => { + if (draft.activeNotebook) { + draft.activeNotebook.statements = draft.statements; + draft.activeNotebook.updatedAt = Date.now(); + + // 更新notebooks数组中的对应笔记本 + const index = draft.notebooks.findIndex(n => n.id === draft.activeNotebook?.id); + if (index !== -1) { + draft.notebooks[index] = draft.activeNotebook; + + // 保存到本地存储 + try { + localStorage.setItem( + localStorageVars.notebooks, + JSON.stringify(draft.notebooks) + ); + } catch (error) { + console.error(intl.formatMessage({ id: 'content.save.notebooks.error' }), error); + } + } + } + }; + + // 处理单元格数据源变化 + const handleCellGraphChange = (cellId: string, newGraphId: string) => { + // 更新单元格的数据源 + updateStore(draft => { + const statementIndex = draft.statements.findIndex(item => item.id === cellId); + if (statementIndex !== -1) { + draft.statements[statementIndex].graphId = newGraphId; + } + }); + + // 如果有必要,这里可以加载新数据源的schema + if (queryGraphSchema) { + queryGraphSchema(newGraphId).then(newSchemaData => { + // 更新特定单元格的schema数据,或者全局schema + // 这取决于实际需求 + }).catch(error => { + console.error(intl.formatMessage( + { id: 'content.load.schema.error' }, + { graphId: newGraphId } + ), error); + }); + } + }; // 处理拖拽结束事件 const handleDragEnd = (event: DragEndEvent) => { @@ -158,7 +333,33 @@ const Content: React.FunctionComponent = props => { } }; - const isEmpty = statements.length === 0; + // 关闭当前 Notebook 并返回欢迎页 + const closeNotebook = () => { + confirm({ + title: intl.formatMessage({ id: 'content.close.notebook.confirm.title' }), + icon: , + content: intl.formatMessage({ id: 'content.close.notebook.confirm.content' }), + okText: intl.formatMessage({ id: 'common.close' }), + cancelText: intl.formatMessage({ id: 'common.cancel' }), + onOk() { + updateStore(draft => { + // 清空当前活动的 notebook + draft.activeNotebook = null; + // 清空语句 + draft.statements = []; + // 清空活动 ID + draft.activeId = ''; + // 显示欢迎页 + draft.showWelcomePage = true; + }); + } + }); + }; + + // 根据 showWelcomePage 决定是否显示欢迎页面 + // 注意:这里我们不再使用 statements.length 来决定是否显示欢迎页 + const isEmpty = showWelcomePage; + /** activeId !== undefined 或值不改变则不滚动*/ useEffect(() => { if (activeId) { @@ -171,39 +372,214 @@ const Content: React.FunctionComponent = props => { setFullscreenId(isFullscreen ? id : null); }; + const handleQuery = (value: IStatement) => { + /** 查询的时候,就可以存储历史记录了 */ + const { script, language, graphId: statementGraphId } = value; + const queryId = uuidv4(); + const timestamp = new Date().getTime(); + const params = { + id: queryId, + timestamp, + script, + language, + // 确保使用传入的graphId,如果没有则使用全局graphId + graphId: statementGraphId || store.graphId, + }; + + updateStore(draft => { + draft.historyStatements.push(params); + + // 更新当前语句的内容,并保存到笔记本 + const index = draft.statements.findIndex(statement => statement.id === value.id); + if (index !== -1) { + draft.statements[index].script = script; + // 保存到活动的笔记本 + updateNotebookStatements(draft); + } + }); + /** 正式查询 */ + return queryGraphData(params); + }; + + // 使用useEffect添加自定义样式 + useEffect(() => { + // 添加自定义样式到页面 + const styleId = 'custom-tabs-styles'; + if (!document.getElementById(styleId)) { + const styleElement = document.createElement('style'); + styleElement.id = styleId; + styleElement.innerHTML = ` + /* 自定义标签样式 */ + .tabs-container .ant-segmented { + background-color: ${token.colorBgElevated}; + border-radius: ${token.borderRadius}px; + box-shadow: 0 1px 2px rgba(0,0,0,0.03); + } + + .tabs-container .ant-segmented-item { + transition: all 0.2s ease; + padding: 4px 12px; + } + + .tabs-container .ant-segmented-item-selected { + background-color: ${token.colorPrimaryBg}; + color: ${token.colorPrimaryText}; + font-weight: 500; + } + + .tabs-container .ant-segmented-thumb { + background-color: ${token.colorPrimaryBg}; + } + + /* 添加渐变阴影指示滚动区域 */ + .tabs-container { + position: relative; + } + + .tabs-container::after { + content: ''; + position: absolute; + top: 0; + right: 0; + height: 100%; + width: 30px; + background: linear-gradient(to right, transparent, ${token.colorBgContainer}); + pointer-events: none; + opacity: 0.8; + } + + /* 添加细节样式 */ + .tab-add-button { + color: ${token.colorPrimary}; + background-color: ${token.colorBgContainer}; + border-color: ${token.colorPrimary}; + opacity: 0.85; + } + + .tab-add-button:hover { + opacity: 1; + transform: scale(1.1); + } + `; + document.head.appendChild(styleElement); + } + + return () => { + // 清理样式 + const styleElement = document.getElementById(styleId); + if (styleElement) { + document.head.removeChild(styleElement); + } + }; + }, [token.colorBgElevated, token.colorPrimary, token.borderRadius, token.colorBgContainer, token.colorPrimaryBg, token.colorPrimaryText]); + return (
-
- -
- + {/* 只在有活动的 notebook 时显示头部 */} + {!isEmpty && ( +
+ +
+ - {mode === 'tabs' && queryOptions.length !== 0 && ( -
- +
+ {/* 显示当前笔记本名称 */} + {activeNotebook && ( +
+ {activeNotebook.name} +
+ )} + + {/* 返回欢迎页按钮 */} + + +
- )} -
+ + {mode === 'tabs' && ( + queryOptions.length !== 0 ? ( +
+ + +
+ ) : ( + null + ) + )} +
+ )}
- {/* {isEmpty && } */} - + {/* 显示Welcome组件 */} + {isEmpty ? : null} {mode === 'flow' ? ( = props => { strategy={verticalListSortingStrategy} > {statements.map((item, index) => { - const { id, script, timestamp, language } = item; + const { id, script, timestamp, language, graphId: cellGraphId } = item; + const isLastCell = index === statements.length - 1; return ( = props => { active={id === activeId} id={id} timestamp={timestamp} - graphId={graphId} + graphId={cellGraphId || graphId} // 使用单元格自己的graphId schemaData={schemaData} script={script} - onQuery={queryGraphData} + onQuery={handleQuery} onCancel={handleCancelQuery} onClose={onClose} onSave={onSave} onFullscreen={(isFullscreen) => handleFullscreen(id, isFullscreen)} isFullscreen={fullscreenId === id} + graphs={availableGraphs} + onGraphChange={handleCellGraphChange} style={{ display: fullscreenId === null || fullscreenId === id ? undefined : 'none', }} @@ -248,7 +629,9 @@ const Content: React.FunctionComponent = props => { ) : ( // tabs 模式下使用普通的 QueryCell 组件 statements.map(item => { - const { id, script, timestamp, language } = item; + const { id, script, timestamp, language, graphId: cellGraphId } = item; + const index = statements.findIndex(s => s.id === id); + const isLastCell = index === statements.length - 1; return (
= props => { active={id === activeId} id={id} timestamp={timestamp} - graphId={graphId} + graphId={cellGraphId || graphId} // 使用单元格自己的graphId schemaData={schemaData} script={script} - onQuery={queryGraphData} + onQuery={handleQuery} onCancel={handleCancelQuery} onClose={onClose} onSave={onSave} onFullscreen={(isFullscreen) => handleFullscreen(id, isFullscreen)} isFullscreen={fullscreenId === id} + graphs={availableGraphs} + onGraphChange={handleCellGraphChange} + onMoveUp={handleMoveUp} + onMoveDown={isLastCell ? undefined : handleMoveDown} + index={index} // 添加索引以供禁用第一个/最后一个单元格的上移/下移 style={{ display: fullscreenId === null || fullscreenId === id ? undefined : 'none', }} @@ -285,16 +673,43 @@ const Content: React.FunctionComponent = props => { }) )} - {/* 添加新单元格按钮 */} - - - + {/* 添加新单元格按钮 - 仅当有活动的 notebook 时显示,并且在flow模式下或在tabs模式但没有标签时才显示 */} + {!isEmpty && (mode === 'flow' || (mode === 'tabs' && statements.length === 0)) && ( +
+ +
+ )}
); diff --git a/packages/studio-query/src/app/content/welcome.tsx b/packages/studio-query/src/app/content/welcome.tsx index 7e9f63e87..53fc9efaa 100644 --- a/packages/studio-query/src/app/content/welcome.tsx +++ b/packages/studio-query/src/app/content/welcome.tsx @@ -1,12 +1,448 @@ import * as React from 'react'; -import { Typography, theme, Alert } from 'antd'; +import { Typography, theme, Alert, Card, Button, Space, Tooltip, Modal, Input, Form } from 'antd'; +import { PlusOutlined, FileOutlined, EditOutlined, DeleteOutlined, ExclamationCircleOutlined } from '@ant-design/icons'; +import { v4 as uuidv4 } from 'uuid'; +import { useContext, INotebook } from '../context'; +import { useDynamicStyle } from '@graphscope/studio-components'; +import dayjs from 'dayjs'; +import { FormattedMessage, useIntl } from 'react-intl'; + interface IWelcomeProps {} const { useToken } = theme; -import { useContext } from '../context'; +const { Title, Paragraph, Text } = Typography; +const { confirm } = Modal; + const Welcome: React.FunctionComponent = props => { const { token } = useToken(); - const { store } = useContext(); - const { welcome } = store; + const { store, updateStore } = useContext(); + const { welcome, statements, language, graphId, notebooks, showWelcomePage } = store; + const [isModalVisible, setIsModalVisible] = React.useState(false); + const [newNotebookName, setNewNotebookName] = React.useState(''); + const [editingNotebook, setEditingNotebook] = React.useState(null); + const intl = useIntl(); + + // 使用 useDynamicStyle 添加样式 + useDynamicStyle(` + .welcome-page { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + height: 100%; + padding: 12px; + background-color: ${token.colorBgLayout}; + box-sizing: border-box; + overflow: hidden; + } + + .welcome-content { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + background-color: ${token.colorBgContainer}; + width: 100%; + height: 100%; + border-radius: 8px; + position: relative; + display: flex; + flex-direction: column; + } + + .welcome-title-container { + display: flex; + flex-direction: column; + align-items: center; + margin-bottom: 20px; + margin-top: 40px; + padding: 0 20px; + } + + .notebook-icon { + font-size: 42px; + color: #1890ff; + margin-bottom: 16px; + } + + .welcome-title { + font-size: 24px; + font-weight: 600; + color: #262626; + margin-bottom: 16px; + text-align: center; + } + + .welcome-description { + font-size: 14px; + color: #8c8c8c; + margin-bottom: 0; + text-align: center; + } + + .empty-icon { + margin-bottom: 24px; + } + + .empty-message { + font-size: 14px; + color: #8c8c8c; + margin-bottom: 60px; + } + + .notebooks-scroll-container { + width: 100%; + flex: 1; + overflow-y: auto; + padding: 0 20px; + margin-bottom: 20px; + display: flex; + flex-direction: column; + align-items: center; + } + + .notebooks-grid { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + gap: 20px; + width: 100%; + max-width: 900px; + padding-bottom: 20px; + } + + .notebook-card { + width: 240px; + height: 160px; + border: 1px solid #f0f0f0; + border-radius: 8px; + transition: all 0.2s; + cursor: pointer; + display: flex; + flex-direction: column; + overflow: hidden; + margin-bottom: 0; + } + + .notebook-card:hover { + border-color: #1890ff; + box-shadow: 0 3px 6px -4px rgba(0,0,0,0.12), 0 6px 16px 0 rgba(0,0,0,0.08), 0 9px 28px 8px rgba(0,0,0,0.05); + } + + .notebook-card-header { + padding: 16px; + border-bottom: 1px solid #f0f0f0; + display: flex; + justify-content: space-between; + align-items: center; + } + + .notebook-card-content { + padding: 16px; + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; + } + + .notebook-meta { + display: flex; + justify-content: space-between; + color: #8c8c8c; + font-size: 12px; + } + + .create-options-container { + padding: 20px; + width: 100%; + display: flex; + justify-content: center; + } + + .create-options { + display: flex; + gap: 24px; + margin-bottom: 20px; + flex-wrap: wrap; + justify-content: center; + } + + .create-button { + height: 56px; + width: 180px; + border: 1px solid #f0f0f0; + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.2s; + color: #595959; + background-color: white; + } + + .create-button:hover { + color: #1890ff; + border-color: #1890ff; + background-color: #e6f7ff; + } + + .create-button-content { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + } + + .create-icon { + color: #1890ff; + font-size: 16px; + } + `,'welcome-page-styles'); + + // 如果不显示欢迎页,返回null + if (!showWelcomePage) { + return null; + } + + // 创建空白 Notebook + const createBlankNotebook = () => { + // 显示创建 Notebook 对话框 + setEditingNotebook(null); + setNewNotebookName(''); + setIsModalVisible(true); + }; + + // 创建示例 Notebook + const createExampleNotebook = () => { + // 显示创建示例 Notebook 对话框 + setEditingNotebook(null); + setNewNotebookName(intl.formatMessage({ id: 'notebook.example' })); + setIsModalVisible(true); + }; + + // 确认创建 Notebook + const handleCreateNotebook = (isExample: boolean = false) => { + const id = uuidv4(); + const now = Date.now(); + + // 如果是示例笔记本,添加示例语句 + const ids = isExample ? [uuidv4(), uuidv4(), uuidv4()] : [uuidv4()]; + + // 根据语言选择示例查询 + const exampleQueries = language === 'cypher' + ? [ + // 获取任意几个节点 + 'MATCH (n) RETURN n LIMIT 3', + + // 获取任意几条边及其连接的节点 + 'MATCH (n)-[r]->(m) RETURN n, r, m LIMIT 5', + + // 获取图中的节点标签和关系类型组合,用于查看图模式 + 'MATCH (n)--(r)--(m) RETURN DISTINCT labels(n), type(r), labels(m) LIMIT 10' + ] + : [ + // 获取任意几个顶点 + 'g.V().limit(3)', + + // 获取边及其起点和终点路径信息 + 'g.E().limit(5).as("e").inV().as("in").outV().as("out").select("out","e","in")', + + // 查看图中不同标签的分布情况 + 'g.V().groupCount().by(label).limit(10)' + ]; + + // 创建语句数组,保存在 notebook 和 statements 中 + const notebookStatements = isExample + ? [ + { + id: ids[0], + script: exampleQueries[0], + language, + graphId, + }, + { + id: ids[1], + script: exampleQueries[1], + language, + graphId, + }, + { + id: ids[2], + script: exampleQueries[2], + language, + graphId, + } + ] + : [ + { + id: ids[0], + script: '', + language, + graphId, + } + ]; + + const defaultNotebookName = intl.formatMessage( + { id: 'notebook.default.name' }, + { number: notebooks.length + 1 } + ); + + const newNotebook: INotebook = { + id, + name: newNotebookName || defaultNotebookName, + createdAt: now, + updatedAt: now, + statements: notebookStatements + }; + + // 更新 notebooks 列表 + updateStore(draft => { + // 添加到 notebooks 列表 + draft.notebooks = [...draft.notebooks, newNotebook]; + // 设置为当前活动 notebook + draft.activeNotebook = newNotebook; + // 不再显示欢迎页 + draft.showWelcomePage = false; + + // 将 notebook 中的语句应用到当前语句 + draft.statements = [...notebookStatements]; + draft.activeId = ids[0]; + + // 保存到本地存储 + try { + localStorage.setItem( + 'GS_STUDIO_QUERY_NOTEBOOKS', + JSON.stringify([...draft.notebooks]) + ); + } catch (error) { + console.error(intl.formatMessage({ id: 'notebook.save.error' }), error); + } + }); + + setIsModalVisible(false); + }; + + // 打开已有的 Notebook + const openNotebook = (notebook: INotebook) => { + updateStore(draft => { + draft.activeNotebook = notebook; + draft.showWelcomePage = false; + + // 从笔记本中加载语句 + if (notebook.statements && notebook.statements.length > 0) { + draft.statements = [...notebook.statements]; + draft.activeId = notebook.statements[0].id; + } else { + // 如果笔记本中没有语句,创建一个空的语句 + const statementId = uuidv4(); + const emptyStatement = { + id: statementId, + script: '', + language, + graphId, + }; + draft.statements = [emptyStatement]; + draft.activeId = statementId; + + // 更新笔记本,添加空语句 + const index = draft.notebooks.findIndex(n => n.id === notebook.id); + if (index !== -1) { + draft.notebooks[index].statements = [emptyStatement]; + draft.notebooks[index].updatedAt = Date.now(); + + // 同步更新 activeNotebook + draft.activeNotebook = draft.notebooks[index]; + + try { + localStorage.setItem( + 'GS_STUDIO_QUERY_NOTEBOOKS', + JSON.stringify(draft.notebooks) + ); + } catch (error) { + console.error(intl.formatMessage({ id: 'notebook.save.error' }), error); + } + } + } + }); + }; + + // 编辑 Notebook + const editNotebook = (notebook: INotebook, e: React.MouseEvent) => { + e.stopPropagation(); + setEditingNotebook(notebook); + setNewNotebookName(notebook.name); + setIsModalVisible(true); + }; + + // 确认编辑 Notebook + const handleEditNotebook = () => { + if (!editingNotebook) return; + + updateStore(draft => { + const index = draft.notebooks.findIndex(n => n.id === editingNotebook.id); + if (index !== -1) { + draft.notebooks[index] = { + ...draft.notebooks[index], + name: newNotebookName || draft.notebooks[index].name, + updatedAt: Date.now() + }; + + // 如果正在编辑当前活动的 notebook,也更新它 + if (draft.activeNotebook && draft.activeNotebook.id === editingNotebook.id) { + draft.activeNotebook = draft.notebooks[index]; + } + + // 保存到本地存储 + try { + localStorage.setItem( + 'GS_STUDIO_QUERY_NOTEBOOKS', + JSON.stringify(draft.notebooks) + ); + } catch (error) { + console.error(intl.formatMessage({ id: 'notebook.save.error' }), error); + } + } + }); + + setIsModalVisible(false); + setEditingNotebook(null); + }; + + // 删除 Notebook + const deleteNotebook = (notebook: INotebook, e: React.MouseEvent) => { + e.stopPropagation(); + + confirm({ + title: intl.formatMessage({ id: 'notebook.delete.confirm.title' }), + icon: , + content: intl.formatMessage({ id: 'notebook.delete.confirm.content' }), + okText: intl.formatMessage({ id: 'common.delete' }), + okType: 'danger', + cancelText: intl.formatMessage({ id: 'common.cancel' }), + onOk() { + updateStore(draft => { + draft.notebooks = draft.notebooks.filter(n => n.id !== notebook.id); + + // 如果删除的是当前活动的 notebook,清空当前活动的 notebook + if (draft.activeNotebook && draft.activeNotebook.id === notebook.id) { + draft.activeNotebook = null; + } + + // 保存到本地存储 + try { + localStorage.setItem( + 'GS_STUDIO_QUERY_NOTEBOOKS', + JSON.stringify(draft.notebooks) + ); + } catch (error) { + console.error(intl.formatMessage({ id: 'notebook.save.error' }), error); + } + }); + } + }); + }; + + // 检查是否应该显示欢迎消息 if (welcome) { const { title, description } = welcome; return ( @@ -14,14 +450,179 @@ const Welcome: React.FunctionComponent = props => { style={{ margin: '12px', borderRadius: '8px', - background: token.colorBgBase, + background: token.colorBgContainer, + boxShadow: '0 1px 3px rgba(0, 0, 0, 0.05)' }} >
); } - return null; + + return ( +
+
+
+
+ + + + + + +
+

+ +

+

+ +

+
+ +
+ {notebooks.length > 0 ? ( +
+ {notebooks.map(notebook => ( +
openNotebook(notebook)} + > +
+ {notebook.name} + +
+
+
+
+ +
+
+ +
+
+
+
+ ))} +
+ ) : ( +
+
+ + + + + + + + +
+
+ +
+
+ )} +
+ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ + {/* 创建/编辑笔记本对话框 */} + { + setIsModalVisible(false); + setEditingNotebook(null); + }} + footer={[ + , + + ]} + > +
+ + setNewNotebookName(e.target.value)} + autoFocus + prefix={} + /> + +
+
+
+ ); }; -export default Welcome; +export default Welcome; \ No newline at end of file diff --git a/packages/studio-query/src/app/context.tsx b/packages/studio-query/src/app/context.tsx index 8ac7c9633..d1b6575cc 100644 --- a/packages/studio-query/src/app/context.tsx +++ b/packages/studio-query/src/app/context.tsx @@ -12,10 +12,26 @@ export interface IStatement { name?: string; /** 查询的语言 */ language?: 'gremlin' | 'cypher'; + /** 关联的图数据源ID */ + graphId?: string; +} + +export interface INotebook { + /** Notebook ID */ + id: string; + /** Notebook 名称 */ + name: string; + /** 创建时间 */ + createdAt: number; + /** 最后修改时间 */ + updatedAt: number; + /** 保存的查询语句 */ + statements: IStatement[]; } export const localStorageVars = { mode: 'GS_STUDIO_QUERY_MODE', + notebooks: 'GS_STUDIO_QUERY_NOTEBOOKS', }; export type IStore = T & { @@ -54,6 +70,12 @@ export type IStore = T & { }; /** 默认的折叠状态 */ defaultCollapsed: boolean; + /** 当前活动的notebook */ + activeNotebook: INotebook | null; + /** 所有notebooks */ + notebooks: INotebook[]; + /** 是否显示welcome页面 */ + showWelcomePage: boolean; }; export const initialStore: IStore<{}> = { @@ -87,6 +109,12 @@ export const initialStore: IStore<{}> = { language: 'gremlin', defaultCollapsed: true, welcome: undefined, + /** 初始没有活动的notebook */ + activeNotebook: null, + /** 初始notebooks为空数组 */ + notebooks: [], + /** 默认显示welcome页面 */ + showWelcomePage: true, }; export const useContext = () => useZustandContext>(); diff --git a/packages/studio-query/src/app/index.tsx b/packages/studio-query/src/app/index.tsx index 82d0bfb23..879264cd2 100644 --- a/packages/studio-query/src/app/index.tsx +++ b/packages/studio-query/src/app/index.tsx @@ -5,7 +5,7 @@ import GPTStatements from './sidebar/gpt-statements'; import RecommendedStatements from './sidebar/recommended-statements'; import StoreProcedure from './sidebar/store-procedure'; import HistoryStatements from './sidebar/history-statements'; -import { useContext, localStorageVars, initialStore } from './context'; +import { useContext, localStorageVars, initialStore, INotebook } from './context'; import type { IStatement, IStudioQueryProps } from './context'; import Sidebar from './sidebar'; @@ -20,11 +20,40 @@ import { faBookmark, faClockFour, faServer, faRobot, faLightbulb } from '@fortaw import StoreProvider from '@graphscope/use-zustand'; import locales from '../locales'; +// 扩展初始化存储的函数 +function extendInitialStore(props: IStudioQueryProps): typeof initialStore { + // 尝试从本地存储加载 notebooks + let notebooks: INotebook[] = []; + try { + const storedNotebooks = localStorage.getItem(localStorageVars.notebooks); + if (storedNotebooks) { + notebooks = JSON.parse(storedNotebooks); + } + } catch (error) { + console.error('加载 notebooks 失败', error); + } + + // 从本地存储中获取视图模式 + const storedMode = localStorage.getItem(localStorageVars.mode); + + return { + ...initialStore, + enableImmediateQuery: props.enableImmediateQuery || false, + language: props.language || 'gremlin', + absolutePosition: props.enableAbsolutePosition || false, + welcome: props.welcome, + defaultCollapsed: true, // 使用确定的布尔值 + mode: (storedMode as any) || 'flow', + notebooks: notebooks, // 添加从本地存储加载的 notebooks + }; +} + const StudioQuery: React.FunctionComponent = props => { const { queryGraphData, handleCancelQuery, queryGraphSchema, + queryInfo, displaySidebarPosition = 'left', displaySidebarType = 'Sidebar', @@ -119,7 +148,7 @@ const StudioQuery: React.FunctionComponent = props => { const handleQuery = (value: IStatement) => { /** 查询的时候,就可以存储历史记录了 */ - const { script, language } = value; + const { script, language, graphId: statementGraphId } = value; const queryId = uuidv4(); const timestamp = new Date().getTime(); const params = { @@ -127,6 +156,8 @@ const StudioQuery: React.FunctionComponent = props => { timestamp, script, language, + // 确保使用传入的graphId,如果没有则使用全局graphId + graphId: statementGraphId || store.graphId, }; updateStore(draft => { @@ -165,6 +196,8 @@ const StudioQuery: React.FunctionComponent = props => { createStatements={createStatements} queryGraphData={handleQuery} enableImmediateQuery={enableImmediateQuery} + queryGraphSchema={queryGraphSchema} + queryInfo={queryInfo} /> @@ -174,8 +207,11 @@ const StudioQuery: React.FunctionComponent = props => { }; export default (props: IStudioQueryProps) => { + // 使用扩展后的初始化存储 + const extendedStore = extendInitialStore(props); + return ( - + ); diff --git a/packages/studio-query/src/components/QueryCell/GraphSelector.tsx b/packages/studio-query/src/components/QueryCell/GraphSelector.tsx new file mode 100644 index 000000000..70ad5e532 --- /dev/null +++ b/packages/studio-query/src/components/QueryCell/GraphSelector.tsx @@ -0,0 +1,131 @@ +import React, { useState, useEffect } from 'react'; +import { Select, Space, Divider, theme, Tooltip } from 'antd'; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { faDatabase } from '@fortawesome/free-solid-svg-icons'; +import { Utils } from '@graphscope/studio-components'; +import { useIntl, FormattedMessage } from 'react-intl'; + +// 引入颜色状态映射 +const STATUS_MAP = { + ACTIVE: { color: '#52c41a', label: 'graphselector.status.active' }, + INACTIVE: { color: '#ff4d4f', label: 'graphselector.status.inactive' }, + LOADING: { color: '#faad14', label: 'graphselector.status.loading' }, + UNKNOWN: { color: '#d9d9d9', label: 'graphselector.status.unknown' }, +}; + +interface IGraph { + id: string; + name: string; + status: string; + [key: string]: any; +} + +interface GraphSelectorProps { + graphId: string; + onGraphChange: (graphId: string) => void; + graphs: IGraph[]; +} + +const { useToken } = theme; + +const GraphSelector: React.FC = ({ graphId, onGraphChange, graphs }) => { + const [options, setOptions] = useState([]); + const { token } = useToken(); + const [selectedGraph, setSelectedGraph] = useState(null); + const intl = useIntl(); + + useEffect(() => { + // 处理图数据选项 + if (graphs && graphs.length > 0) { + const graphOptions = graphs + .filter(item => Object.keys(item).length > 0) + .map(item => ({ + label: ( + + + {item.name} + + ), + value: item.id, + data: item, + })); + + setOptions(graphOptions); + + // 查找并设置当前选中的图 + const current = graphs.find(g => g.id === graphId); + if (current) { + setSelectedGraph(current); + } + } + }, [graphs, graphId]); + + // 切换数据源 + const handleChange = (value: string) => { + onGraphChange(value); + + // 更新当前选中的图信息 + const selected = graphs.find(g => g.id === value); + if (selected) { + setSelectedGraph(selected); + } + }; + + // 获取当前图状态 + const status = selectedGraph?.status || 'UNKNOWN'; + const statusColor = STATUS_MAP[status]?.color || STATUS_MAP.UNKNOWN.color; + const statusLabelId = STATUS_MAP[status]?.label || STATUS_MAP.UNKNOWN.label; + + return ( +
+ +
+ +
+
+ + { + // 确保获取焦点后选择所有文本 + e.target.select(); + }} + onKeyDown={(e) => { + // 捕获Enter键事件并防止冒泡 + if (e.key === 'Enter') { + e.stopPropagation(); + e.preventDefault(); + confirm(); + } + }} + onClick={(e) => { + // 防止点击事件关闭Popconfirm + e.stopPropagation(); + }} + /> + } onConfirm={confirm} onCancel={cancel} okText="Save" cancelText="Cancel" placement="bottomRight" + open={isPopconfirmOpen} + onOpenChange={handleOpenChange} > -
diff --git a/packages/studio-query/src/statement/result/table.tsx b/packages/studio-query/src/statement/result/table.tsx index 1e67c846b..edaf23b16 100644 --- a/packages/studio-query/src/statement/result/table.tsx +++ b/packages/studio-query/src/statement/result/table.tsx @@ -249,8 +249,8 @@ const TableView: React.FunctionComponent = props => { height: 'calc(100% - 32px)', boxSizing: 'border-box', }}> - {Content} - {mode === 'chart' && table.length !== 0 && } + {Content} + {mode === 'chart' && table.length !== 0 && }
); diff --git a/todo.md b/todo.md deleted file mode 100644 index 357394571..000000000 --- a/todo.md +++ /dev/null @@ -1,12 +0,0 @@ -目前 (Statement) 是固定垂直排列的、可以通过 React DnD 来实现拖拽排序; -添加全屏功能 (状态,按钮) -增删改查目前都有,可以优化 -将 QueryCell (Statement) 组件重构为独立的模块 -根据对 dnd-kit 的研究,实现一个 QueryCell 组件,添加展开、收起、排序和移动功能 - -header中搜索时添加一个statement不变、在app/content/index.tsx中添加dnd排序; -在statement中添加展开收起、全屏、在表格中添加复制粘贴导出等功能; -删除默认的 script 语句 -只在查询后显示 Result 内容 -改进全屏模式,让全屏按钮始终可见 -全屏模式只显示当前 QueryCell \ No newline at end of file