diff --git a/CHANGELOG.md b/CHANGELOG.md index 0c0918d4..58962d09 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## [Unreleased] +## v0.1.17 + +- Added node reconnection feature +- Styling and theme/sidebar state updates +- Dependency updates + ## v0.1.16 - Dependency updates diff --git a/README.md b/README.md index df951043..45bf0411 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,17 @@  [](https://coveralls.io/github/waldiez/react) [](https://badge.fury.io/js/@waldiez%2Freact) -## Requirements +## Installation from npm registry + +```bash +# any of the following +npm install @waldiez/react +yarn add @waldiez/react +pnpm add @waldiez/react +bun add @waldiez/react +``` + +## Requirements for development - Node.js - yarn@4.5.3 @@ -22,7 +32,7 @@ "react-icons": "^5.3.0", "react-select": "^5.8.3", "zundo": "^2.3.0", - "zustand": "^5.0.1" + "zustand": "^5.0.2" } ``` diff --git a/package.json b/package.json index 2fb99046..cb837329 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@waldiez/react", "license": "MIT", - "version": "0.1.16", + "version": "0.1.17", "type": "module", "main": "./dist/@waldiez.umd.cjs", "module": "./dist/@waldiez.js", @@ -77,10 +77,10 @@ "react-icons": "^5.4.0", "react-select": "^5.8.3", "zundo": "^2.3.0", - "zustand": "^5.0.1" + "zustand": "^5.0.2" }, "devDependencies": { - "@eslint/compat": "^1.2.3", + "@eslint/compat": "^1.2.4", "@eslint/js": "9.16.0", "@stylistic/eslint-plugin": "^2.11.0", "@testing-library/jest-dom": "^6.6.3", @@ -91,7 +91,7 @@ "@types/gunzip-maybe": "^1.4.2", "@types/jest": "^29.5.14", "@types/jest-image-snapshot": "^6.4.0", - "@types/react": "^18.3.12", + "@types/react": "^18.3.13", "@types/react-dom": "^18.3.1", "@types/tar-stream": "^3.1.3", "@typescript-eslint/eslint-plugin": "^8.17.0", @@ -101,10 +101,10 @@ "@vitest/coverage-v8": "^2.1.8", "@vitest/ui": "^2.1.8", "ajv": "^8.17.1", - "dotenv": "^16.4.6", + "dotenv": "^16.4.7", "eslint": "^9.16.0", "eslint-config-prettier": "^9.1.0", - "eslint-import-resolver-typescript": "^3.6.3", + "eslint-import-resolver-typescript": "^3.7.0", "eslint-plugin-import": "^2.31.0", "eslint-plugin-prettier": "^5.2.1", "eslint-plugin-react-refresh": "^0.4.16", @@ -115,7 +115,7 @@ "lookpath": "^1.2.2", "playwright": "^1.49.0", "pre-commit": "^1.2.2", - "prettier": "^3.4.1", + "prettier": "^3.4.2", "react-hotkeys-hook": "^4.6.1", "react-select-event": "^5.5.1", "rimraf": "^6.0.1", @@ -124,13 +124,13 @@ "stylelint-config-standard": "^36.0.1", "stylelint-prettier": "^5.0.2", "tar-stream": "^3.1.7", - "terser": "^5.36.0", + "terser": "^5.37.0", "ts-json-schema-generator": "^2.3.0", "tsx": "^4.19.2", - "typedoc": "^0.27.2", + "typedoc": "^0.27.3", "typescript": "^5.7.2", "typescript-eslint": "^8.17.0", - "vite": "^6.0.2", + "vite": "^6.0.3", "vite-plugin-dts": "^4.3.0", "vite-plugin-externalize-deps": "^0.8.0", "vitest": "^2.1.8", diff --git a/schema.json b/schema.json index faf0cab9..87374c3d 100644 --- a/schema.json +++ b/schema.json @@ -1,5 +1,5 @@ { - "$id": "https://github.com/waldiez/react/tree/v0.1.16/schema.json", + "$id": "https://github.com/waldiez/react/tree/v0.1.17/schema.json", "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "properties": { diff --git a/src/waldiez/components/flow/main.tsx b/src/waldiez/components/flow/main.tsx index e82795b8..b5bcc6dd 100644 --- a/src/waldiez/components/flow/main.tsx +++ b/src/waldiez/components/flow/main.tsx @@ -80,7 +80,7 @@ export const WaldiezFlow = (props: WaldiezFlowProps) => { onKeyDown={onKeyDown} onNodeDoubleClick={onNodeDoubleClick} onEdgeDoubleClick={onEdgeDoubleClick} - // onReconnect={store.onReconnect} + onReconnect={store.onReconnect} colorMode={colorMode} elevateNodesOnSelect={true} elevateEdgesOnSelect={true} diff --git a/src/waldiez/store/creator.ts b/src/waldiez/store/creator.ts index a30d5f15..6707fba3 100644 --- a/src/waldiez/store/creator.ts +++ b/src/waldiez/store/creator.ts @@ -1,7 +1,7 @@ import diff from 'microdiff'; import { temporal } from 'zundo'; -import { Edge, EdgeChange, Node, NodeChange, ReactFlowInstance, XYPosition } from '@xyflow/react'; +import { Connection, Edge, EdgeChange, Node, NodeChange, ReactFlowInstance, XYPosition } from '@xyflow/react'; import { createStore } from 'zustand'; @@ -87,6 +87,8 @@ export const createWaldiezStore = (props?: WaldiezStoreProps) => { updateEdgePath: (id: string, agentType: WaldiezAgentNodeType) => EdgesStore.updateEdgePath(id, agentType, get, set), getEdgeSourceAgent: (edge: Edge) => EdgesStore.getEdgeSourceAgent(edge, get), + onReconnect: (oldEdge: Edge, newConnection: Connection) => + EdgesStore.onReconnect(oldEdge, newConnection, get, set), // nodes getNodes: () => get().nodes, onNodesChange: (changes: NodeChange<Node>[]) => NodesStore.onNodesChange(changes, get, set), diff --git a/src/waldiez/store/edges/index.ts b/src/waldiez/store/edges/index.ts index d0f6a7cc..484b3883 100644 --- a/src/waldiez/store/edges/index.ts +++ b/src/waldiez/store/edges/index.ts @@ -1,4 +1,4 @@ -import { Edge, EdgeChange, applyEdgeChanges } from '@xyflow/react'; +import { Connection, Edge, EdgeChange, applyEdgeChanges } from '@xyflow/react'; import { WaldiezAgentNode, @@ -267,4 +267,83 @@ export class EdgesStore { updatedAt: new Date().toISOString() }); }; + + static onReconnect: (oldEdge: Edge, newConnection: Connection, get: typeOfGet, set: typeOfSet) => void = ( + oldEdge, + newConnection, + get, + set + ) => { + const { oldSourceNode, oldTargetNode, newSourceNode, newTargetNode, color } = getReconnectNodesAndColor( + oldEdge, + newConnection, + get + ); + if (!oldSourceNode || !oldTargetNode || !newSourceNode || !newTargetNode) { + console.error('Not all nodes found'); + return; + } + if (oldSourceNode.id === newSourceNode.id && oldTargetNode.id === newTargetNode.id) { + return; + } + if (!color) { + console.error('Color not found'); + return false; + } + set({ + edges: [ + ...get().edges.map(edge => { + if (edge.id !== oldEdge.id) { + return edge; + } + return { + ...oldEdge, + source: newConnection.source, + target: newConnection.target, + ...edgeCommonStyle(oldEdge.type as 'chat' | 'nested' | 'group' | 'hidden', color) + }; + }) + ], + updatedAt: new Date().toISOString() + }); + EdgesStore.resetEdgePositions(get, set); + EdgesStore.resetEdgeOrders(get, set); + }; } + +const getReconnectNodesAndColor = ( + oldEdge: Edge, + newConnection: Connection, + get: typeOfGet +): { + oldSourceNode: WaldiezAgentNode | undefined; + oldTargetNode: WaldiezAgentNode | undefined; + newSourceNode: WaldiezAgentNode | undefined; + newTargetNode: WaldiezAgentNode | undefined; + color: string | undefined; +} => { + let oldSourceNode: WaldiezAgentNode | undefined; + let oldTargetNode: WaldiezAgentNode | undefined; + let newSourceNode: WaldiezAgentNode | undefined; + let newTargetNode: WaldiezAgentNode | undefined; + let color: string | undefined; + for (const node of get().nodes) { + if (node.id === oldEdge.source) { + oldSourceNode = node as WaldiezAgentNode; + } + if (node.id === oldEdge.target) { + oldTargetNode = node as WaldiezAgentNode; + } + if (node.id === newConnection.source) { + newSourceNode = node as WaldiezAgentNode; + color = AGENT_COLORS[newSourceNode.data.agentType]; + } + if (node.id === newConnection.target) { + newTargetNode = node as WaldiezAgentNode; + } + if (oldSourceNode && oldTargetNode && newSourceNode && newTargetNode) { + break; + } + } + return { oldSourceNode, oldTargetNode, newSourceNode, newTargetNode, color }; +}; diff --git a/src/waldiez/store/selector.ts b/src/waldiez/store/selector.ts index 2febef14..2e0d443b 100644 --- a/src/waldiez/store/selector.ts +++ b/src/waldiez/store/selector.ts @@ -30,6 +30,7 @@ export const selector = (store: WaldiezState) => ({ updateEdgePath: store.updateEdgePath, updateEdgeData: store.updateEdgeData, getEdgeSourceAgent: store.getEdgeSourceAgent, + onReconnect: store.onReconnect, // nodes getNodes: store.getNodes, onNodesChange: store.onNodesChange, diff --git a/src/waldiez/store/types.ts b/src/waldiez/store/types.ts index f287981e..55b0f65f 100644 --- a/src/waldiez/store/types.ts +++ b/src/waldiez/store/types.ts @@ -1,4 +1,5 @@ import { + Connection, Edge, EdgeChange, Node, @@ -77,6 +78,7 @@ export type WaldiezState = WaldiezStoreProps & { updateEdgePath: (id: string, agentType: WaldiezAgentNodeType) => void; updateEdgeData: (id: string, data: Edge['data']) => void; getEdgeSourceAgent: (edge: Edge) => WaldiezAgentNode | null; + onReconnect: (oldEdge: Edge, newConnection: Connection) => void; // nodes getNodes: () => Node[]; onNodesChange: OnNodesChange; diff --git a/src/waldiez/utils/storage/sidebar.ts b/src/waldiez/utils/storage/sidebar.ts index 8d5862af..92eb8ff3 100644 --- a/src/waldiez/utils/storage/sidebar.ts +++ b/src/waldiez/utils/storage/sidebar.ts @@ -6,6 +6,10 @@ const __SIDEBAR_STORAGE_KEY = 'waldiez_sidebar'; * @returns boolean */ export const isSidebarCollapsed = (storageId: string) => { + const fromBody = getIsSidebarCollapsedFromBody(); + if (typeof fromBody === 'boolean') { + return fromBody; + } const storageValue = localStorage.getItem(__SIDEBAR_STORAGE_KEY); if (storageValue) { try { @@ -29,6 +33,7 @@ export const setSidebarCollapsed = (storageId: string, isCollapsed: boolean) => const lockFile = `waldiez_sidebar_${storageId}.lock`; if (!window.localStorage.getItem(lockFile)) { window.localStorage.setItem(lockFile, '1'); + setSidebarCollapsedToBody(isCollapsed); const sidebars = getStoredSidebarStates(); sidebars[storageId] = isCollapsed.toString(); localStorage.setItem(__SIDEBAR_STORAGE_KEY, JSON.stringify(sidebars)); @@ -54,3 +59,31 @@ const getStoredSidebarStates = () => { } return sidebars; }; + +/** + * Get the initial state of the sidebar from the body class. + * @returns boolean | undefined + */ +const getIsSidebarCollapsedFromBody = () => { + if (document.body.classList.contains('waldiez-sidebar-collapsed')) { + return true; + } + if (document.body.classList.contains('waldiez-sidebar-expanded')) { + return false; + } + return undefined; +}; + +/** + * Set the state of the sidebar to the body class. + * @param isCollapsed - The state of the sidebar + */ +const setSidebarCollapsedToBody = (isCollapsed: boolean) => { + if (isCollapsed) { + document.body.classList.add('waldiez-sidebar-collapsed'); + document.body.classList.remove('waldiez-sidebar-expanded'); + } else { + document.body.classList.add('waldiez-sidebar-expanded'); + document.body.classList.remove('waldiez-sidebar-collapsed'); + } +}; diff --git a/src/waldiez/utils/storage/theme.ts b/src/waldiez/utils/storage/theme.ts index 304ec07c..ba9af497 100644 --- a/src/waldiez/utils/storage/theme.ts +++ b/src/waldiez/utils/storage/theme.ts @@ -6,9 +6,14 @@ const __THEME_STORAGE_KEY = 'waldiez_theme'; * Check if the current mode is dark * @returns boolean **/ +// eslint-disable-next-line max-statements export const isDarkMode = (flowId: string, storageId: string) => { // first check if the theme is set in local storage // in storage: {waldiez_theme: {storageId: 'dark/light'}} + const fromBodyClass = classInBody(); + if (typeof fromBodyClass === 'boolean') { + return fromBodyClass; + } const fromLocalStorage = themeInLocalStorage(storageId); if (typeof fromLocalStorage === 'boolean') { return fromLocalStorage; @@ -42,6 +47,7 @@ export const setDarkMode = (flowId: string, storageId: string, dark: boolean) => themes[storageId] = dark ? 'dark' : 'light'; window.localStorage.setItem(__THEME_STORAGE_KEY, JSON.stringify(themes)); updateFlowDivClass(flowId, dark); + updateBodyClass(dark); setTimeout(() => { window.localStorage.removeItem(lockFile); }, 200); @@ -86,6 +92,16 @@ const updateFlowDivClass = (flowId: string, dark: boolean) => { } }; +const updateBodyClass = (dark: boolean) => { + if (dark) { + document.body.classList.add('waldiez-dark'); + document.body.classList.remove('waldiez-light'); + } else { + document.body.classList.add('waldiez-light'); + document.body.classList.remove('waldiez-dark'); + } +}; + const themeInLocalStorage = (storageId: string) => { const theme = window.localStorage.getItem(__THEME_STORAGE_KEY); if (theme) { @@ -122,3 +138,13 @@ const themeInRootDiv = (flowId: string) => { } return null; }; + +const classInBody = () => { + if (document.body.classList.contains('waldiez-dark')) { + return true; + } + if (document.body.classList.contains('waldiez-light')) { + return false; + } + return null; +}; diff --git a/tests/browser/__snapshots__/waldiez.test.tsx.snap b/tests/browser/__snapshots__/waldiez.test.tsx.snap index ec63ab47..c4ce6542 100644 --- a/tests/browser/__snapshots__/waldiez.test.tsx.snap +++ b/tests/browser/__snapshots__/waldiez.test.tsx.snap @@ -3,7 +3,9 @@ exports[`All > should render Waldiez components 1`] = ` { "asFragment": [Function], - "baseElement": <body> + "baseElement": <body + class="waldiez-light" + > diff --git a/tests/components/sidebar/sidebar.test.tsx b/tests/components/sidebar/sidebar.test.tsx index 41ac3f7b..3fbd44f6 100644 --- a/tests/components/sidebar/sidebar.test.tsx +++ b/tests/components/sidebar/sidebar.test.tsx @@ -4,6 +4,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { SideBar } from '@waldiez/components/sidebar'; import { SideBarProps } from '@waldiez/components/sidebar/types'; import { WaldiezProvider } from '@waldiez/store'; +import { isSidebarCollapsed } from '@waldiez/utils/storage'; const flowId = 'test'; const storageId = 'test-storage'; @@ -58,6 +59,8 @@ describe('SideBar', () => { removeItemSpy.mockClear(); vi.resetAllMocks(); vi.useRealTimers(); + document.body.classList.remove('waldiez-sidebar-collapsed'); + document.body.classList.remove('waldiez-sidebar-expanded'); }); it('should render successfully', () => { @@ -75,6 +78,18 @@ describe('SideBar', () => { expect(sidebar).toHaveClass('sidebar collapsed', { exact: true }); }); + it('should get the state of the sidebar from the body class', () => { + document.body.classList.add('waldiez-sidebar-collapsed'); + expect(getItemSpy).toBeCalledTimes(0); + expect(isSidebarCollapsed(storageId)).toBe(true); + document.body.classList.remove('waldiez-sidebar-collapsed'); + document.body.classList.add('waldiez-sidebar-expanded'); + expect(isSidebarCollapsed(storageId)).toBe(false); + document.body.classList.remove('waldiez-sidebar-expanded'); + getItemSpy.mockReturnValueOnce(`{"${storageId}":"true"}`); + expect(isSidebarCollapsed(storageId)).toBe(true); + }); + it('should call onEditFlow', () => { renderSidebar(); expect(HTMLDialogElement.prototype.showModal).not.toHaveBeenCalled(); diff --git a/tests/theme.test.ts b/tests/theme.test.ts index 8c481fce..412e0022 100644 --- a/tests/theme.test.ts +++ b/tests/theme.test.ts @@ -19,6 +19,8 @@ describe('theme', () => { getItemSpy.mockClear(); setItemSpy.mockClear(); removeItemSpy.mockClear(); + document.body.classList.remove('waldiez-light'); + document.body.classList.remove('waldiez-dark'); }); it('should return storage value', () => { @@ -95,4 +97,13 @@ describe('theme', () => { expect(isDarkMode('test', 'test')).toBe(true); document.body.removeChild(flowRoot); }); + + it('should use the body class if set', () => { + document.body.classList.add('waldiez-dark'); + expect(isDarkMode('test', 'test')).toBe(true); + document.body.classList.remove('waldiez-dark'); + document.body.classList.add('waldiez-light'); + expect(isDarkMode('test', 'test')).toBe(false); + document.body.classList.remove('waldiez-light'); + }); }); diff --git a/yarn.lock b/yarn.lock index fed47fca..2438741b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -74,7 +74,20 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.23.0, @babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0": +"@babel/generator@npm:^7.23.0": + version: 7.26.3 + resolution: "@babel/generator@npm:7.26.3" + dependencies: + "@babel/parser": "npm:^7.26.3" + "@babel/types": "npm:^7.26.3" + "@jridgewell/gen-mapping": "npm:^0.3.5" + "@jridgewell/trace-mapping": "npm:^0.3.25" + jsesc: "npm:^3.0.2" + checksum: 10/c1d8710cc1c52af9d8d67f7d8ea775578aa500887b327d2a81e27494764a6ef99e438dd7e14cf7cd3153656492ee27a8362980dc438087c0ca39d4e75532c638 + languageName: node + linkType: hard + +"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0": version: 7.26.2 resolution: "@babel/generator@npm:7.26.2" dependencies: @@ -198,7 +211,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.5, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.2": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.25.3, @babel/parser@npm:^7.25.4, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.2": version: 7.26.2 resolution: "@babel/parser@npm:7.26.2" dependencies: @@ -209,6 +222,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.20.5, @babel/parser@npm:^7.23.0, @babel/parser@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/parser@npm:7.26.3" + dependencies: + "@babel/types": "npm:^7.26.3" + bin: + parser: ./bin/babel-parser.js + checksum: 10/e7e3814b2dc9ee3ed605d38223471fa7d3a84cbe9474d2b5fa7ac57dc1ddf75577b1fd3a93bf7db8f41f28869bda795cddd80223f980be23623b6434bf4c88a8 + languageName: node + linkType: hard + "@babel/plugin-transform-react-jsx-self@npm:^7.25.9": version: 7.25.9 resolution: "@babel/plugin-transform-react-jsx-self@npm:7.25.9" @@ -294,7 +318,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.17.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.23.0, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.4, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.4, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0": version: 7.26.0 resolution: "@babel/types@npm:7.26.0" dependencies: @@ -304,6 +328,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.17.0, @babel/types@npm:^7.23.0, @babel/types@npm:^7.24.7, @babel/types@npm:^7.26.3": + version: 7.26.3 + resolution: "@babel/types@npm:7.26.3" + dependencies: + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10/c31d0549630a89abfa11410bf82a318b0c87aa846fbf5f9905e47ba5e2aa44f41cc746442f105d622c519e4dc532d35a8d8080460ff4692f9fc7485fbf3a00eb + languageName: node + linkType: hard + "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" @@ -1013,15 +1047,15 @@ __metadata: languageName: node linkType: hard -"@eslint/compat@npm:^1.2.3": - version: 1.2.3 - resolution: "@eslint/compat@npm:1.2.3" +"@eslint/compat@npm:^1.2.4": + version: 1.2.4 + resolution: "@eslint/compat@npm:1.2.4" peerDependencies: eslint: ^9.10.0 peerDependenciesMeta: eslint: optional: true - checksum: 10/5a8fc6ecb127a1ce757c2b94e4a71fd72939c3e9007eb80c0a819618e1c7cc98ffe3e5229a504c52e6f5b5dc0f6be3b899fa6a3dedb220cb4a02c8d5d0c333df + checksum: 10/872ac21e3f430575ba70916d83f5a4e7e9cc7fa953111c99ecef225d1ed05b66fbdb5034761dd9035f00c3f0d7ca7657f8cbfa4ff7ead3967f630c8c783d2beb languageName: node linkType: hard @@ -2103,7 +2137,7 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:*, @types/react@npm:^18.3.12": +"@types/react@npm:*": version: 18.3.12 resolution: "@types/react@npm:18.3.12" dependencies: @@ -2113,6 +2147,16 @@ __metadata: languageName: node linkType: hard +"@types/react@npm:^18.3.13": + version: 18.3.13 + resolution: "@types/react@npm:18.3.13" + dependencies: + "@types/prop-types": "npm:*" + csstype: "npm:^3.0.2" + checksum: 10/4f2b851cabdb68430b50998ad18f206edaea5b3c651d92e3573d86b7ac740224a91b7ca63176fa70e1defc78459faf518e5d2f58e1ba2839b1f12365dab70de2 + languageName: node + linkType: hard + "@types/stack-utils@npm:^2.0.0": version: 2.0.3 resolution: "@types/stack-utils@npm:2.0.3" @@ -2546,7 +2590,7 @@ __metadata: version: 0.0.0-use.local resolution: "@waldiez/react@workspace:." dependencies: - "@eslint/compat": "npm:^1.2.3" + "@eslint/compat": "npm:^1.2.4" "@eslint/js": "npm:9.16.0" "@monaco-editor/react": "npm:^4.6.0" "@stylistic/eslint-plugin": "npm:^2.11.0" @@ -2558,7 +2602,7 @@ __metadata: "@types/gunzip-maybe": "npm:^1.4.2" "@types/jest": "npm:^29.5.14" "@types/jest-image-snapshot": "npm:^6.4.0" - "@types/react": "npm:^18.3.12" + "@types/react": "npm:^18.3.13" "@types/react-dom": "npm:^18.3.1" "@types/tar-stream": "npm:^3.1.3" "@typescript-eslint/eslint-plugin": "npm:^8.17.0" @@ -2569,10 +2613,10 @@ __metadata: "@vitest/ui": "npm:^2.1.8" "@xyflow/react": "npm:^12.3.5" ajv: "npm:^8.17.1" - dotenv: "npm:^16.4.6" + dotenv: "npm:^16.4.7" eslint: "npm:^9.16.0" eslint-config-prettier: "npm:^9.1.0" - eslint-import-resolver-typescript: "npm:^3.6.3" + eslint-import-resolver-typescript: "npm:^3.7.0" eslint-plugin-import: "npm:^2.31.0" eslint-plugin-prettier: "npm:^5.2.1" eslint-plugin-react-refresh: "npm:^0.4.16" @@ -2585,7 +2629,7 @@ __metadata: nanoid: "npm:^5.0.9" playwright: "npm:^1.49.0" pre-commit: "npm:^1.2.2" - prettier: "npm:^3.4.1" + prettier: "npm:^3.4.2" rc-slider: "npm:^11.1.7" react: "npm:^18.3.1" react-dom: "npm:^18.3.1" @@ -2600,19 +2644,19 @@ __metadata: stylelint-config-standard: "npm:^36.0.1" stylelint-prettier: "npm:^5.0.2" tar-stream: "npm:^3.1.7" - terser: "npm:^5.36.0" + terser: "npm:^5.37.0" ts-json-schema-generator: "npm:^2.3.0" tsx: "npm:^4.19.2" - typedoc: "npm:^0.27.2" + typedoc: "npm:^0.27.3" typescript: "npm:^5.7.2" typescript-eslint: "npm:^8.17.0" - vite: "npm:^6.0.2" + vite: "npm:^6.0.3" vite-plugin-dts: "npm:^4.3.0" vite-plugin-externalize-deps: "npm:^0.8.0" vitest: "npm:^2.1.8" vitest-browser-react: "npm:^0.0.4" zundo: "npm:^2.3.0" - zustand: "npm:^5.0.1" + zustand: "npm:^5.0.2" languageName: unknown linkType: soft @@ -3547,7 +3591,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6, debug@npm:^4.3.7": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:^4.3.7": version: 4.3.7 resolution: "debug@npm:4.3.7" dependencies: @@ -3674,10 +3718,10 @@ __metadata: languageName: node linkType: hard -"dotenv@npm:^16.4.6": - version: 16.4.6 - resolution: "dotenv@npm:16.4.6" - checksum: 10/86bf758c47ec2585cf171ded83f0ff8b7327d865116ab8a327ff9ec84e35cc8f7cd3f68cef7ce6ec2907310228a4ec4f310cf701615973aba4a9b57bdbb65c59 +"dotenv@npm:^16.4.7": + version: 16.4.7 + resolution: "dotenv@npm:16.4.7" + checksum: 10/f13bfe97db88f0df4ec505eeffb8925ec51f2d56a3d0b6d916964d8b4af494e6fb1633ba5d09089b552e77ab2a25de58d70259b2c5ed45ec148221835fc99a0c languageName: node linkType: hard @@ -4185,18 +4229,18 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-typescript@npm:^3.6.3": - version: 3.6.3 - resolution: "eslint-import-resolver-typescript@npm:3.6.3" +"eslint-import-resolver-typescript@npm:^3.7.0": + version: 3.7.0 + resolution: "eslint-import-resolver-typescript@npm:3.7.0" dependencies: "@nolyfill/is-core-module": "npm:1.0.39" - debug: "npm:^4.3.5" + debug: "npm:^4.3.7" enhanced-resolve: "npm:^5.15.0" - eslint-module-utils: "npm:^2.8.1" fast-glob: "npm:^3.3.2" get-tsconfig: "npm:^4.7.5" is-bun-module: "npm:^1.0.2" is-glob: "npm:^4.0.3" + stable-hash: "npm:^0.0.4" peerDependencies: eslint: "*" eslint-plugin-import: "*" @@ -4206,11 +4250,11 @@ __metadata: optional: true eslint-plugin-import-x: optional: true - checksum: 10/5f9956dbbd0becc3d6c6cb945dad0e5e6f529cfd0f488d5688f3c59840cd7f4a44ab6aee0f54b5c4188134dab9a01cb63c1201767bde7fc330b7c1a14747f8ac + checksum: 10/8158730c11e562c56ed9bf7236dc75bce35b6992dc32c39ac2f4177ab77fca97b95999850204a6458054243607b54aee88c028a61fed4184f24f425fa1afff01 languageName: node linkType: hard -"eslint-module-utils@npm:^2.12.0, eslint-module-utils@npm:^2.8.1": +"eslint-module-utils@npm:^2.12.0": version: 2.12.0 resolution: "eslint-module-utils@npm:2.12.0" dependencies: @@ -6798,12 +6842,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.4.1": - version: 3.4.1 - resolution: "prettier@npm:3.4.1" +"prettier@npm:^3.4.2": + version: 3.4.2 + resolution: "prettier@npm:3.4.2" bin: prettier: bin/prettier.cjs - checksum: 10/1ee4d1b1a9b6761cbb847cd81b9d87e51a0f4b2a4d5fe5755627c24828afe057a7ee9b764c3ee777d84abd46218d173d8a204ee9cb3acdd321ff9a6b25f99c1c + checksum: 10/a3e806fb0b635818964d472d35d27e21a4e17150c679047f5501e1f23bd4aa806adf660f0c0d35214a210d5d440da6896c2e86156da55f221a57938278dc326e languageName: node linkType: hard @@ -7627,6 +7671,13 @@ __metadata: languageName: node linkType: hard +"stable-hash@npm:^0.0.4": + version: 0.0.4 + resolution: "stable-hash@npm:0.0.4" + checksum: 10/21c039d21c1cb739cf8342561753a5e007cb95ea682ccd452e76310bbb9c6987a89de8eda023e320b019f3e4691aabda75079cdbb7dadf7ab9013e931f2f23cd + languageName: node + linkType: hard + "stack-utils@npm:^2.0.3": version: 2.0.6 resolution: "stack-utils@npm:2.0.6" @@ -7997,9 +8048,9 @@ __metadata: languageName: node linkType: hard -"terser@npm:^5.36.0": - version: 5.36.0 - resolution: "terser@npm:5.36.0" +"terser@npm:^5.37.0": + version: 5.37.0 + resolution: "terser@npm:5.37.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -8007,7 +8058,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10/52e641419f79d7ccdecd136b9a8e0b03f93cfe3b53cce556253aaabc347d3f2af1745419b9e622abc95d592084dc76e57774b8f9e68d29d543f4dd11c044daf4 + checksum: 10/3afacf7c38c47a5a25dbe1ba2e7aafd61166474d4377ec0af490bd41ab3686ab12679818d5fe4a3e7f76efee26f639c92ac334940c378bbc31176520a38379c3 languageName: node linkType: hard @@ -8300,9 +8351,9 @@ __metadata: languageName: node linkType: hard -"typedoc@npm:^0.27.2": - version: 0.27.2 - resolution: "typedoc@npm:0.27.2" +"typedoc@npm:^0.27.3": + version: 0.27.3 + resolution: "typedoc@npm:0.27.3" dependencies: "@gerrit0/mini-shiki": "npm:^1.24.0" lunr: "npm:^2.3.9" @@ -8313,7 +8364,7 @@ __metadata: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x bin: typedoc: bin/typedoc - checksum: 10/645a5850090247c6b2361ec9059c19d6ee181897b48a4f396c3a7c7bd8c7e4e6a5cd817e7d21060c2f42625d5f192a0e944bc0a315cd9e9ec8f77c25a5a4b0fd + checksum: 10/f62eeb0f3f37b9a09e137e5d6e2042b374c670cb8fbdfc6f1427a1b1bb449a30755bdd6be2c503676c66150207aa3c49c4d850f0154b20f8e2ca49b1e522cc76 languageName: node linkType: hard @@ -8596,9 +8647,9 @@ __metadata: languageName: node linkType: hard -"vite@npm:^6.0.2": - version: 6.0.2 - resolution: "vite@npm:6.0.2" +"vite@npm:^6.0.3": + version: 6.0.3 + resolution: "vite@npm:6.0.3" dependencies: esbuild: "npm:^0.24.0" fsevents: "npm:~2.3.3" @@ -8644,7 +8695,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10/24fea725676da1812ec0f073d1748a09f6fd8552a86b9b2b3002326d8cb8ada72e0abfe0837b00077412dc5bbd1773aec38d1fc3462709b0ecc1512332b5d2a0 + checksum: 10/eca0949b8cbc887e78977515d8fc22eaa2d03425d60a0a422f2db1da9d26bd1b431b2815a273c798e8e3fe176a99e105c3d87b0ba615ca19b8bf19e0334d807a languageName: node linkType: hard @@ -9086,9 +9137,9 @@ __metadata: languageName: node linkType: hard -"zustand@npm:^5.0.1": - version: 5.0.1 - resolution: "zustand@npm:5.0.1" +"zustand@npm:^5.0.2": + version: 5.0.2 + resolution: "zustand@npm:5.0.2" peerDependencies: "@types/react": ">=18.0.0" immer: ">=9.0.6" @@ -9103,6 +9154,6 @@ __metadata: optional: true use-sync-external-store: optional: true - checksum: 10/9ee5b2483213157c519be2647e873fb21962b4e6e521031916e8969552379dd03348057c9dfd030eb1e7ef98a945a1f99f9aa9badda5d9673eb4004e354dc2dc + checksum: 10/9fb60796b9770dcc3f78dd794e7f424ff735e5676784cbc9726761037613942b62470b24a9ca9e98534ee4369a3b5429be570ff34281cb3c9d6d4e8df559ec3f languageName: node linkType: hard