From fd6b8cf94c95cd8ea71e5f632ac2242169d232e8 Mon Sep 17 00:00:00 2001 From: Vivy <4380412+Matthbo@users.noreply.github.com> Date: Fri, 17 Jul 2026 14:54:53 +0200 Subject: [PATCH 1/6] Make eslint rules more aligned with FF! Console linting rules --- pnpm-lock.yaml | 2739 +++++++++++------------ src/main/frontend/eslint.config.mjs | 264 ++- src/main/frontend/eslint.config.old.mjs | 92 + src/main/frontend/package.json | 32 +- 4 files changed, 1661 insertions(+), 1466 deletions(-) create mode 100644 src/main/frontend/eslint.config.old.mjs diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e77588f4..df7d010f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,19 +31,19 @@ importers: version: 1.1.8 '@frankframework/doc-library-core': specifier: ^1.0.3 - version: 1.0.3 + version: 1.0.6 '@frankframework/doc-library-react': specifier: ^1.0.3 - version: 1.0.3(react@19.2.5) + version: 1.0.4(react@19.2.7) '@mdx-js/rollup': specifier: ^3.1.1 version: 3.1.1(rollup@4.60.2) '@xyflow/react': specifier: ^12.10.2 - version: 12.10.2(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 12.11.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) allotment: specifier: ^1.20.5 - version: 1.20.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 1.20.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7) clsx: specifier: ^2.1.1 version: 2.1.1 @@ -57,8 +57,8 @@ importers: specifier: ^0.8.3 version: 0.8.3 isbot: - specifier: ^5.1.39 - version: 5.1.39 + specifier: ^5.2.1 + version: 5.2.1 monaco-editor: specifier: 0.55.1 version: 0.55.1 @@ -67,16 +67,16 @@ importers: version: 1.1.1 react: specifier: ^19.2.5 - version: 19.2.5 + version: 19.2.7 react-complex-tree: specifier: ^2.6.1 - version: 2.6.1(react@19.2.5) + version: 2.6.2(react@19.2.7) react-dom: specifier: ^19.2.5 - version: 19.2.5(react@19.2.5) + version: 19.2.7(react@19.2.7) react-router: specifier: ^8.0.1 - version: 8.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 8.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) remark-gfm: specifier: ^4.0.1 version: 4.0.1 @@ -85,119 +85,119 @@ importers: version: 1.2.13 tailwind-merge: specifier: ^3.5.0 - version: 3.5.0 + version: 3.6.0 xmllint-wasm: specifier: ^5.2.0 - version: 5.2.0(@types/node@20.19.39) + version: 5.2.0(@types/node@20.19.43) zustand: specifier: ^5.0.12 - version: 5.0.12(@types/react@19.2.14)(react@19.2.5)(use-sync-external-store@1.6.0(react@19.2.5)) + version: 5.0.14(@types/react@19.2.17)(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)) devDependencies: '@eslint/js': - specifier: ^9.39.4 - version: 9.39.4 + specifier: ^10.0.1 + version: 10.0.1(eslint@10.7.0(jiti@2.7.0)) '@mdx-js/react': specifier: ^3.1.1 - version: 3.1.1(@types/react@19.2.14)(react@19.2.5) + version: 3.1.1(@types/react@19.2.17)(react@19.2.7) '@prettier/plugin-xml': specifier: ^3.4.2 - version: 3.4.2(prettier@3.8.3) + version: 3.4.2(prettier@3.9.5) '@stylistic/eslint-plugin': specifier: ^5.10.0 - version: 5.10.0(eslint@9.39.4(jiti@2.6.1)) + version: 5.10.0(eslint@10.7.0(jiti@2.7.0)) '@tailwindcss/vite': - specifier: ^4.2.4 - version: 4.2.4(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) + specifier: ^4.3.3 + version: 4.3.3(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0)) '@testing-library/jest-dom': specifier: ^6.9.1 version: 6.9.1 '@testing-library/react': specifier: ^16.3.2 - version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@testing-library/user-event': specifier: ^14.6.1 version: 14.6.1(@testing-library/dom@10.4.1) '@types/mdx': specifier: ^2.0.13 - version: 2.0.13 + version: 2.0.14 '@types/node': specifier: ^20.19.39 - version: 20.19.39 + version: 20.19.43 '@types/react': specifier: ^19.2.14 - version: 19.2.14 + version: 19.2.17 '@types/react-dom': specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.14) + version: 19.2.3(@types/react@19.2.17) '@typescript-eslint/eslint-plugin': - specifier: ^8.62.0 - version: 8.62.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.64.0 + version: 8.64.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.59.0 - version: 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.64.0 + version: 8.64.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) '@vitejs/plugin-react': specifier: ^6.0.2 - version: 6.0.3(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) + version: 6.0.3(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0)) '@vitest/ui': specifier: ^4.1.5 - version: 4.1.5(vitest@4.1.5) + version: 4.1.10(vitest@4.1.10) eslint: - specifier: ^9.39.4 - version: 9.39.4(jiti@2.6.1) + specifier: ^10.7.0 + version: 10.7.0(jiti@2.7.0) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.39.4(jiti@2.6.1)) + version: 10.1.8(eslint@10.7.0(jiti@2.7.0)) eslint-plugin-prettier: specifier: ^5.5.5 - version: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1))(prettier@3.8.3) + version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.7.0(jiti@2.7.0)))(eslint@10.7.0(jiti@2.7.0))(prettier@3.9.5) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.39.4(jiti@2.6.1)) + version: 7.37.5(eslint@10.7.0(jiti@2.7.0)) eslint-plugin-react-hooks: specifier: ^7.1.1 - version: 7.1.1(eslint@9.39.4(jiti@2.6.1)) + version: 7.1.1(eslint@10.7.0(jiti@2.7.0)) eslint-plugin-sonarjs: - specifier: ^4.0.3 - version: 4.0.3(eslint@9.39.4(jiti@2.6.1)) + specifier: ^4.2.0 + version: 4.2.0(eslint@10.7.0(jiti@2.7.0)) eslint-plugin-unicorn: - specifier: ^64.0.0 - version: 64.0.0(eslint@9.39.4(jiti@2.6.1)) + specifier: ^72.0.0 + version: 72.0.0(eslint@10.7.0(jiti@2.7.0)) jsdom: - specifier: ^28.0.3 - version: 28.1.0 + specifier: ^29.1.1 + version: 29.1.1 prettier: - specifier: ^3.8.3 - version: 3.8.3 + specifier: ^3.9.5 + version: 3.9.5 prettier-plugin-tailwindcss: - specifier: ^0.6.14 - version: 0.6.14(prettier@3.8.3) + specifier: ^0.8.1 + version: 0.8.1(prettier@3.9.5) react-router-devtools: specifier: ^6.2.1 - version: 6.2.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(csstype@3.2.3)(react-dom@19.2.5(react@19.2.5))(react-router@8.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) + version: 6.2.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.2.7(react@19.2.7))(react-router@8.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(solid-js@1.9.12)(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0)) tailwindcss: - specifier: ^4.2.4 - version: 4.2.4 + specifier: ^4.3.3 + version: 4.3.3 typescript: specifier: ^5.9.3 version: 5.9.3 typescript-eslint: - specifier: ^8.59.0 - version: 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.64.0 + version: 8.64.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) vite: - specifier: ^8.0.16 - version: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + specifier: ^8.1.5 + version: 8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0) vite-plugin-checker: - specifier: ^0.14.1 - version: 0.14.1(eslint@9.39.4(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) + specifier: ^0.14.4 + version: 0.14.4(eslint@10.7.0(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0)) vite-plugin-svgr: specifier: ^5.2.0 - version: 5.2.0(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) + version: 5.2.0(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0)) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.9.3)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) + version: 5.1.4(typescript@5.9.3)(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0)) vitest: specifier: ^4.1.5 - version: 4.1.5(@types/node@20.19.39)(@vitest/ui@4.1.5)(jsdom@28.1.0)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) + version: 4.1.10(@types/node@20.19.43)(@vitest/ui@4.1.10)(jsdom@29.1.1)(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0)) src/main/frontend/cypress: devDependencies: @@ -216,18 +216,16 @@ importers: packages: - '@acemir/cssom@0.9.31': - resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==} - - '@adobe/css-tools@4.4.4': - resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} + '@adobe/css-tools@4.5.0': + resolution: {integrity: sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==} '@asamuzakjp/css-color@5.1.11': resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@asamuzakjp/dom-selector@6.8.1': - resolution: {integrity: sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==} + '@asamuzakjp/dom-selector@7.1.1': + resolution: {integrity: sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} '@asamuzakjp/generational-cache@1.0.1': resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} @@ -236,10 +234,6 @@ packages: '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} - engines: {node: '>=6.9.0'} - '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} @@ -252,10 +246,6 @@ packages: resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.1': - resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.29.7': resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==} engines: {node: '>=6.9.0'} @@ -264,10 +254,6 @@ packages: resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.29.7': resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} @@ -282,18 +268,10 @@ packages: peerDependencies: '@babel/core': ^7.29.6 - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.29.7': resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.29.7': resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} @@ -306,46 +284,29 @@ packages: resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/parser@7.29.7': resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} '@babel/template@7.29.7': resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.7': resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} - engines: {node: '>=6.9.0'} - '@babel/types@7.29.7': resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==} engines: {node: '>=6.9.0'} - '@biomejs/cli-darwin-arm64@2.4.13': - resolution: {integrity: sha512-2KImO1jhNFBa2oWConyr0x6flxbQpGKv6902uGXpYM62Xyem8U80j441SyUJ8KyngsmKbQjeIv1q2CQfDkNnYg==} + '@biomejs/cli-darwin-arm64@2.5.4': + resolution: {integrity: sha512-4o3NFRobXHynkgcFVrlZsoDAFtF2ldlEGN8sORSws5ZQqyY4PXnPUIylu4ksfyHuwkfvDREuWh3JK+niRwGq3w==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] @@ -360,19 +321,19 @@ packages: resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} hasBin: true - '@csstools/color-helpers@6.0.2': - resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} + '@csstools/color-helpers@6.1.0': + resolution: {integrity: sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==} engines: {node: '>=20.19.0'} - '@csstools/css-calc@3.2.0': - resolution: {integrity: sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==} + '@csstools/css-calc@3.2.1': + resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-color-parser@4.1.0': - resolution: {integrity: sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==} + '@csstools/css-color-parser@4.1.9': + resolution: {integrity: sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==} engines: {node: '>=20.19.0'} peerDependencies: '@csstools/css-parser-algorithms': ^4.0.0 @@ -384,8 +345,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.3': - resolution: {integrity: sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==} + '@csstools/css-syntax-patches-for-csstree@1.1.6': + resolution: {integrity: sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==} peerDependencies: css-tree: ^3.2.1 peerDependenciesMeta: @@ -429,36 +390,41 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.2': - resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-helpers@0.6.0': + resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.5': - resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/css-tree@4.0.4': + resolution: {integrity: sha512-nxMparyhqVWQvadx9x8dIfubfIPOE+X2b2waua8fzdnM9vdp9rgVtwEZlG0TmCwEUz/d/f40fzvO/eqBwdxz0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/js@9.39.4': - resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true - '@eslint/object-schema@2.1.7': - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@exodus/bytes@1.15.0': - resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} + '@exodus/bytes@1.15.1': + resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: '@noble/hashes': ^1.8.0 || ^2.0.0 @@ -466,20 +432,20 @@ packages: '@noble/hashes': optional: true - '@floating-ui/core@1.7.5': - resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + '@floating-ui/core@1.8.0': + resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} - '@floating-ui/dom@1.7.6': - resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + '@floating-ui/dom@1.8.0': + resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} - '@floating-ui/utils@0.2.11': - resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@floating-ui/utils@0.2.12': + resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} - '@frankframework/doc-library-core@1.0.3': - resolution: {integrity: sha512-o4L62zPVb+Yzn3czAfuOkb1RrbRD8VqQRvcGcIRxPp//55LcfU4NdtOCkF0FDp12f89DL4EP+RwibP+r6KeSjA==} + '@frankframework/doc-library-core@1.0.6': + resolution: {integrity: sha512-HbRcwZFWHcc2LAa3vp6C+D2G7n70SB+5o1tmVX8YnZqamLmFgcHAQsBLUZPrqqrfzRAM+7hrwRrtfTJAam96Ag==} - '@frankframework/doc-library-react@1.0.3': - resolution: {integrity: sha512-Ndb0Rmf6MitP2U17w6racoZrCxbKmPAHMs3JNgO2FyXDVnEbvT/MI5Losox9HuRopdr4ORciTUDQi6Q5u0WhkQ==} + '@frankframework/doc-library-react@1.0.4': + resolution: {integrity: sha512-LD53NlZ2pLbtKTN3zOP2crHXi+iyjEzLYuhcoO3cIa3ytycnaKAezXX/neQyoHJF+dxDAYm3UM88QtCfhoieog==} peerDependencies: react: ^19.1.0 || ^20.0.0 @@ -546,16 +512,16 @@ packages: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@oxc-project/types@0.137.0': - resolution: {integrity: sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==} + '@oxc-project/types@0.139.0': + resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/core@0.2.9': - resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@pkgr/core@0.3.6': + resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} + engines: {node: ^14.18.0 || >=16.0.0} '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} @@ -565,11 +531,11 @@ packages: peerDependencies: prettier: ^3.0.0 - '@radix-ui/primitive@1.1.3': - resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + '@radix-ui/primitive@1.1.5': + resolution: {integrity: sha512-d86WIWFYNtGA0H/d8exstrTRTp7eWJYlYJbtNofxr/3ljupZYn6EFDG/Qgu/0Kc8v7yMUxySagqJsL1+PdYjWg==} - '@radix-ui/react-accordion@1.2.12': - resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==} + '@radix-ui/react-accordion@1.2.16': + resolution: {integrity: sha512-BpZJNmetujnGgUI6OX0jEhEmlA46WPqgub8Rv09Kyquwd0cc1ndMKpiPYCjmBU6KSSRPAMtgLpEoZSG/tdNIWQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -581,8 +547,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-collapsible@1.1.12': - resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} + '@radix-ui/react-collapsible@1.1.16': + resolution: {integrity: sha512-opfXRe6nnzyGmCDPx+l1Aqo/RbqWtQal2FnsBqF9hhePp6j0LsRoBaRxcMOlTv+uYTJVtWYZKg9t9wTe+BA/ZA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -594,8 +560,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-collection@1.1.7': - resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + '@radix-ui/react-collection@1.1.12': + resolution: {integrity: sha512-nb67INpE0IahJKN7EYPp9m9YGwYeKlnzxT3MwXVkgCskaSJia97kG4T0ywpjNUSSnoJk/uvk12V8vbrEHEj+/Q==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -607,8 +573,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-compose-refs@1.1.2': - resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + '@radix-ui/react-compose-refs@1.1.3': + resolution: {integrity: sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -616,8 +582,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-context@1.1.2': - resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + '@radix-ui/react-context@1.2.0': + resolution: {integrity: sha512-fOE+JtN9rygNZkCnHRBEP0TAvLldlhyOxMsbwFvTP4nAs+nBmfnna+o/Zski2wkmY1YMrFC0aSzsHoLY47iLrg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -625,8 +591,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-direction@1.1.1': - resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + '@radix-ui/react-direction@1.1.2': + resolution: {integrity: sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -634,8 +600,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-id@1.1.1': - resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + '@radix-ui/react-id@1.1.2': + resolution: {integrity: sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -643,8 +609,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-presence@1.1.5': - resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} + '@radix-ui/react-presence@1.1.7': + resolution: {integrity: sha512-zBZ4QM5XG3JRanDmqXYf3MD6th4AFXFmgU6KNMFzUaV6F3uw9I5/zjMUvFriSEn5ewo1nxuibvyxJdmLlDcslA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -656,8 +622,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-primitive@2.1.3': - resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + '@radix-ui/react-primitive@2.1.7': + resolution: {integrity: sha512-bC3NiwsprbxKjuon9l7X6BUTw7FPVzEYaL92MPEY5SCd/9hUTPXVFtVwRix7778wtRsVao+zE062gL79FZleeQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -669,8 +635,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-slot@1.2.3': - resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + '@radix-ui/react-slot@1.3.0': + resolution: {integrity: sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -678,8 +644,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-controllable-state@1.2.2': - resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + '@radix-ui/react-use-controllable-state@1.2.3': + resolution: {integrity: sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -687,8 +653,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-effect-event@0.0.2': - resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + '@radix-ui/react-use-effect-event@0.0.3': + resolution: {integrity: sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -696,8 +662,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-use-layout-effect@1.1.1': - resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + '@radix-ui/react-use-layout-effect@1.1.2': + resolution: {integrity: sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -705,91 +671,97 @@ packages: '@types/react': optional: true - '@rolldown/binding-android-arm64@1.1.3': - resolution: {integrity: sha512-DT6Z3PhvioeHMvxo+xHc3KtqggrI7CCTXCmC2h/5zUlp5jVitv7XEy+9q5/7v8IolhlioawpMo8Kg0EEBy7J0g==} + '@rolldown/binding-android-arm64@1.1.5': + resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.1.3': - resolution: {integrity: sha512-0NwgwsjM7LrsuVnXMK3koTpagBNOhloc/BNjKqZjv4V5zI5r13qx69uVhRx+o5Z0yy4Hzq+lpy7TAgUG/ocvrw==} + '@rolldown/binding-darwin-arm64@1.1.5': + resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.1.3': - resolution: {integrity: sha512-YtiBp4disu6V560loT6PjMdiRaWmVvDNrUunAalbiFx2ggeJwxdAsgZMcoGP17uyAsTwAj5V1niksxlHnVQ1Sw==} + '@rolldown/binding-darwin-x64@1.1.5': + resolution: {integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.1.3': - resolution: {integrity: sha512-yD3EkEdXk2LypPxnf/kSZHirarsI8gcPzc62SukhR9VJTyvV+F9Q/GxWNuCojc7sXyuVC4DxRGhdDK4X8VSsbw==} + '@rolldown/binding-freebsd-x64@1.1.5': + resolution: {integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.1.3': - resolution: {integrity: sha512-c+8vieQbsD7HNAHKIA34w0GJ9FedFFuJGD+7E6vz7Q3uqAIugL5p45fhlsj4UaAsHpcmlqugBWMhA0/j7o0sIg==} + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': + resolution: {integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.1.3': - resolution: {integrity: sha512-50jD0uUwLvur7Zz9LHz17kaAdTPjn5wN93hEgjvmYFRZwiR7ZJYovTd5ipyWJDAnXKvZ+wgc+/Ika6dwSF5OcA==} + '@rolldown/binding-linux-arm64-gnu@1.1.5': + resolution: {integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.1.3': - resolution: {integrity: sha512-BO9+oPL8K9poZJBfYPsXNtYjPE5uM3qeehT3aFcW4LITOl+iSqhp0abzjR2nWBUNjIZeKXjAEWBZ64WjNoHd6w==} + '@rolldown/binding-linux-arm64-musl@1.1.5': + resolution: {integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.1.3': - resolution: {integrity: sha512-f3VpLB1vQ0Eo6ecr/6cekLnvYMFF4YBFoVGkfkvPLq1bAkbAwHYQPZKoAmG6OJyTcxxoC+AvezGx/S1obNC0Mw==} + '@rolldown/binding-linux-ppc64-gnu@1.1.5': + resolution: {integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] + libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.1.3': - resolution: {integrity: sha512-AmurZ26Pqx/RI9N1gzEOCklkKXl927yjfXWUUS0O7Puh8ARM/Ob8qfrD3qnWksScdw6cSrW5PSHE9DyLu7+PtA==} + '@rolldown/binding-linux-s390x-gnu@1.1.5': + resolution: {integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] + libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.1.3': - resolution: {integrity: sha512-JJpqs8bRGITDOdbkNKnlojzBabbOHrqjSvDr0IVsZObE1lBcPjxItUEY9eWIDbxaJ3cGrXPWGfGkIxFijg/URg==} + '@rolldown/binding-linux-x64-gnu@1.1.5': + resolution: {integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.1.3': - resolution: {integrity: sha512-rSJcdjPxzA/by/6/rYs+v+bXU7UjvnbUWz8MJb6kh6+knqB1dCrtHg0uu7C/4haqJvqdkYHQ5IGn+tCH9GLW/g==} + '@rolldown/binding-linux-x64-musl@1.1.5': + resolution: {integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] - '@rolldown/binding-openharmony-arm64@1.1.3': - resolution: {integrity: sha512-hQ3/PYkDJICgevvyNcVrihVeqq7k1Pp3VZ9lY+dauAYUJKO+auqApvANhvR1An9BhmqYKvW2Mu1F9u4DXSMLxQ==} + '@rolldown/binding-openharmony-arm64@1.1.5': + resolution: {integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.1.3': - resolution: {integrity: sha512-Elcv/BtML9lXrV6JuKITc/grN2kYV9gjsQpW8Jfw4ioK0TOkjBjye0nnyqQNy9STNaI20lXNaQBRrD5gSgR0Yg==} + '@rolldown/binding-wasm32-wasi@1.1.5': + resolution: {integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.1.3': - resolution: {integrity: sha512-2DrEfhluH9yhiaFApmsjsjwrSYbNcY1oFTzYSP1a535jDbV98zCFanA/96TBUd0iDFcxGmw9QRExwGCXz3U+/g==} + '@rolldown/binding-win32-arm64-msvc@1.1.5': + resolution: {integrity: sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.1.3': - resolution: {integrity: sha512-OL4OMk7UPXOeVGGd3qo5zJyPIljf4AFgk5QAkPPS+OoLuOOozhuaQGC18MxVTnw/06q93gShAJzlwnSCY9YtqA==} + '@rolldown/binding-win32-x64-msvc@1.1.5': + resolution: {integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -797,8 +769,8 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - '@rollup/pluginutils@5.3.0': - resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + '@rollup/pluginutils@5.4.0': + resolution: {integrity: sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -821,6 +793,11 @@ packages: cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.62.2': + resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.60.2': resolution: {integrity: sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==} cpu: [x64] @@ -840,66 +817,85 @@ packages: resolution: {integrity: sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.60.2': resolution: {integrity: sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.60.2': resolution: {integrity: sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.60.2': resolution: {integrity: sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.60.2': resolution: {integrity: sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.60.2': resolution: {integrity: sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.60.2': resolution: {integrity: sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.60.2': resolution: {integrity: sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.60.2': resolution: {integrity: sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.60.2': resolution: {integrity: sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.60.2': resolution: {integrity: sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.60.2': resolution: {integrity: sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==} cpu: [x64] os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.62.2': + resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} + cpu: [x64] + os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.60.2': resolution: {integrity: sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.60.2': resolution: {integrity: sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==} @@ -931,33 +927,33 @@ packages: cpu: [x64] os: [win32] - '@solid-primitives/event-listener@2.4.5': - resolution: {integrity: sha512-nwRV558mIabl4yVAhZKY8cb6G+O1F0M6Z75ttTu5hk+SxdOnKSGj+eetDIu7Oax1P138ZdUU01qnBPR8rnxaEA==} + '@solid-primitives/event-listener@2.4.6': + resolution: {integrity: sha512-5I0YJcTVYIWoMmgBSROBZGcz+ymhew/pGTg2dHW74BUjFKsV8Li4bOZYl0YAGP4mHw5o4UBd9/BEesqBci3wxw==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/keyboard@1.3.5': - resolution: {integrity: sha512-sav+l+PL+74z3yaftVs7qd8c2SXkqzuxPOVibUe5wYMt+U5Hxp3V3XCPgBPN2I6cANjvoFtz0NiU8uHVLdi9FQ==} + '@solid-primitives/keyboard@1.3.7': + resolution: {integrity: sha512-558RPNYnXx4nGh537DSqAn4xMrC8iFipl/5+xzgzWoTNFst4RnUN3BOLmtDjJ0UGGoQXVMALYR3bNOHM0xnt1Q==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/resize-observer@2.1.5': - resolution: {integrity: sha512-AiyTknKcNBaKHbcSMuxtSNM8FjIuiSuFyFghdD0TcCMU9hKi9EmsC5pjfjDwxE+5EueB1a+T/34PLRI5vbBbKw==} + '@solid-primitives/resize-observer@2.2.0': + resolution: {integrity: sha512-9Fuu/EWBeGj+atGHRJp70HKhdfalmpjwxY8a32NZixdLNmfCJ45AfhLQNr6uOzETbbiMx4iCKlTrJ8KZCHC2Ww==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/rootless@1.5.3': - resolution: {integrity: sha512-N8cIDAHbWcLahNRLr0knAAQvXyEdEMoAZvIMZKmhNb1mlx9e2UOv9BRD5YNwQUJwbNoYVhhLwFOEOcVXFx0HqA==} + '@solid-primitives/rootless@1.5.4': + resolution: {integrity: sha512-TOIZa1VUfVJ+9nkCcRajw3U4t9vBOP1HxX1WHNTbXq32mXwlqTvUnC4CRIilohcryBkT9u2ZkhUDSHRTaGp55g==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/static-store@0.1.3': - resolution: {integrity: sha512-uxez7SXnr5GiRnzqO2IEDjOJRIXaG+0LZLBizmUA1FwSi+hrpuMzVBwyk70m4prcl8X6FDDXUl9O8hSq8wHbBQ==} + '@solid-primitives/static-store@0.1.4': + resolution: {integrity: sha512-LgtVaVBtB7EbmS4+M0b8xY5Iq6pUWXBsIC4VgtrFKDGDdyCaDt88sHk0fUlx1Enxm/XZnZyLXJABRoa39RjJqA==} peerDependencies: solid-js: ^1.6.12 - '@solid-primitives/utils@6.4.0': - resolution: {integrity: sha512-AeGTBg8Wtkh/0s+evyLtP8piQoS4wyqqQaAFs2HJcFMMjYAtUgo+ZPduRXLjPlqKVc2ejeR544oeqpbn8Egn8A==} + '@solid-primitives/utils@6.4.1': + resolution: {integrity: sha512-ISSB5QX1qP2ynrheIpYwc4oKR5Ny4siNuUyf1qZniy+Il+p/PtDB0QK1Dnle8noiHpwRD3gpPdubOC3qI/Zamg==} peerDependencies: solid-js: ^1.6.12 @@ -1038,65 +1034,69 @@ packages: peerDependencies: '@svgr/core': '*' - '@tailwindcss/node@4.2.4': - resolution: {integrity: sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==} + '@tailwindcss/node@4.3.3': + resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==} - '@tailwindcss/oxide-android-arm64@4.2.4': - resolution: {integrity: sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==} + '@tailwindcss/oxide-android-arm64@4.3.3': + resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==} engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.2.4': - resolution: {integrity: sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==} + '@tailwindcss/oxide-darwin-arm64@4.3.3': + resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==} engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.2.4': - resolution: {integrity: sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==} + '@tailwindcss/oxide-darwin-x64@4.3.3': + resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==} engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.2.4': - resolution: {integrity: sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==} + '@tailwindcss/oxide-freebsd-x64@4.3.3': + resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==} engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4': - resolution: {integrity: sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': + resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==} engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.2.4': - resolution: {integrity: sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': + resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] + libc: [glibc] - '@tailwindcss/oxide-linux-arm64-musl@4.2.4': - resolution: {integrity: sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==} + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': + resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] + libc: [musl] - '@tailwindcss/oxide-linux-x64-gnu@4.2.4': - resolution: {integrity: sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==} + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': + resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==} engines: {node: '>= 20'} cpu: [x64] os: [linux] + libc: [glibc] - '@tailwindcss/oxide-linux-x64-musl@4.2.4': - resolution: {integrity: sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==} + '@tailwindcss/oxide-linux-x64-musl@4.3.3': + resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==} engines: {node: '>= 20'} cpu: [x64] os: [linux] + libc: [musl] - '@tailwindcss/oxide-wasm32-wasi@4.2.4': - resolution: {integrity: sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==} + '@tailwindcss/oxide-wasm32-wasi@4.3.3': + resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -1107,24 +1107,24 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.2.4': - resolution: {integrity: sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==} + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': + resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==} engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.2.4': - resolution: {integrity: sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==} + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': + resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==} engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.2.4': - resolution: {integrity: sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==} + '@tailwindcss/oxide@4.3.3': + resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==} engines: {node: '>= 20'} - '@tailwindcss/vite@4.2.4': - resolution: {integrity: sha512-pCvohwOCspk3ZFn6eJzrrX3g4n2JY73H6MmYC87XfGPyTty4YsCjYTMArRZm/zOI8dIt3+EcrLHAFPe5A4bgtw==} + '@tailwindcss/vite@4.3.3': + resolution: {integrity: sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 || ^8 @@ -1144,8 +1144,8 @@ packages: resolution: {integrity: sha512-cNnJ89Q021Zf883rlbBTfsaxTfi2r73/qejGtyTa7ksErF3hyDyAq1aTbo5crK9dAL7zSHh9viKY1BtMls1QOA==} engines: {node: '>=18'} - '@tanstack/devtools-event-client@0.4.3': - resolution: {integrity: sha512-OZI6QyULw0FI0wjgmeYzCIfbgPsOEzwJtCpa69XrfLMtNXLGnz3d/dIabk7frg0TmHo+Ah49w5I4KC7Tufwsvw==} + '@tanstack/devtools-event-client@0.4.4': + resolution: {integrity: sha512-6T5Yop/793YI+H+5J8Hsyj4kCih9sl4t3ElLgKioW5hk3ocn+ZdSJ94tT7vL7uabxSugWYBZlOTMPzEw2puvQw==} engines: {node: '>=18'} hasBin: true @@ -1242,14 +1242,20 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1257,22 +1263,22 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/mdx@2.0.13': - resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + '@types/mdx@2.0.14': + resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==} '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@20.19.39': - resolution: {integrity: sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==} + '@types/node@20.19.43': + resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.2.14': - resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@types/react@19.2.17': + resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} '@types/sinonjs__fake-timers@8.1.1': resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} @@ -1292,119 +1298,67 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.59.0': - resolution: {integrity: sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==} + '@typescript-eslint/eslint-plugin@8.64.0': + resolution: {integrity: sha512-CGvQPBxN3wZLu6Rz2kFUpZeoCm78xUic92ck39KPePkO1NPOwjCqdQnm5Q87tpWw9vcBvW8XLrDXjH9PWYtJ3Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.59.0 + '@typescript-eslint/parser': ^8.64.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/eslint-plugin@8.62.0': - resolution: {integrity: sha512-o+mpz7EYiMzXoySXiKmzlabIvTVqUuK5yLrAedRPRDA0IpPFMUV1IXt6OqljIxX/kumN6EjUYp41Hqelh6p/Dw==} + '@typescript-eslint/parser@8.64.0': + resolution: {integrity: sha512-KA0OshtlcCCXmbfqyZkM5pV3/WNraJf7DkJRLpyrmwPtud57H5BDX7C3k0LPSPxpprfRL+cJDGabF10mvNCoCw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.62.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.59.0': - resolution: {integrity: sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==} + '@typescript-eslint/project-service@8.64.0': + resolution: {integrity: sha512-tk4WpOJ6IEbGrVHaNmM0YRrwAD3exZlIK3iadQNAxh4YKk6jvUQ4ecq18n+v7+meh+cJ3j+D8nbk8sRKhlwLQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.59.0': - resolution: {integrity: sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==} + '@typescript-eslint/scope-manager@8.64.0': + resolution: {integrity: sha512-CXEaFdYXjSTgKhisNkwCcJwTP8Pl+fmRrEQrri4nm3vU743bALrxzLmq7fHG/7e6a5xO0lDYeURpZmBuhHk54w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.62.0': - resolution: {integrity: sha512-wexnCqiTg7BOGtbLDftYpRWlmLq4xfoMd7BKFR6Y75sZS3QmRKLdN3yWLhmIYgqMmP/OXWpj3H8odkb5nGURCQ==} + '@typescript-eslint/tsconfig-utils@8.64.0': + resolution: {integrity: sha512-2yo8rRNKuzbVWQp5kslhANqZ2uDAeROQHBRZNPu8JDsHmeFNj/XJJhX/FhNUWmkHHvoNsKa6+tHJiig87EzsQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.59.0': - resolution: {integrity: sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/scope-manager@8.62.0': - resolution: {integrity: sha512-1lX38kNxXIRb8mEc3lbq5mdHq1Pf2+U0nFU65KfT18mtPxxl0fvjuEE92mHuXPuCtElJhOrddOpyMlM3Z0umEA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.59.0': - resolution: {integrity: sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/tsconfig-utils@8.62.0': - resolution: {integrity: sha512-y2GAdB6ykaXUvuspbYnizQc4oDDz0Tz/Yc7iWrXf9mx8vm/L/0vLHCe0tS2boG96Zy+DivnVDQ9ZUEWoHqqx1g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/type-utils@8.59.0': - resolution: {integrity: sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==} + '@typescript-eslint/type-utils@8.64.0': + resolution: {integrity: sha512-XWG4Fmmv/6SvyS9nH8jWrKs6terwJvE8cyRt1CzYYqzp9OrPhCT4cMc/f7C6RZCwG+qMmiffJS1/qJP8G1URtg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.62.0': - resolution: {integrity: sha512-+g5O3j0w2ldzC86Pv6fvbO/xhAonbJFIdf/MKQ1d30gndlsVzUOE83ldfSE15Qrl9fhFjK6AovHs5Wpp6vx86w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/types@8.59.0': - resolution: {integrity: sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.62.0': - resolution: {integrity: sha512-KvAclkktORPvM54TgLgA4z9HIV1M8zOgw9ZVNXl9f/8dLYfXYX1wkMXP7qmabpijQRV5bHJLOmoyGQbLMaUYeg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.59.0': - resolution: {integrity: sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/typescript-estree@8.62.0': - resolution: {integrity: sha512-+hVbNxtW64pIcZWDPGbyaKF7vp2IBTVY5ma1blwwksrjdsbdqqEKvJWMGbBofei4F6Dovx1M0RJgoFeNu2279A==} + '@typescript-eslint/types@8.64.0': + resolution: {integrity: sha512-qjhfuTfLXjA4IOzXvz0rTjT01BqEiIgPoUeMwiEjnaHKJMTNo8rH5pYW1a2L/0Dnux2fPC85AeyJoWaGa8WxTA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.59.0': - resolution: {integrity: sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==} + '@typescript-eslint/typescript-estree@8.64.0': + resolution: {integrity: sha512-Pztpsn1aCE1oWDvDEfUk31nngvvF7vUB5SwHFEaZIFpvw7WJtqUHHL4plBZDA9HfWJJjL13BdG0YrJInTUvoVA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.62.0': - resolution: {integrity: sha512-82r66fi9zYwZ+mTq3vKgwjbZ1PVk/DJzrXFLpG6RnBbdvH8TEGVHIs9H4d2drhkOzf0syZuD/OZvvlu6GDbP4g==} + '@typescript-eslint/utils@8.64.0': + resolution: {integrity: sha512-aJUGVB3+U0htrrCjoA8qukw8cm8fNCGAxK/tVoS70k8aeb7DETKeFozRiVFIwEeN9WJLsjaP3ph8I60tY2XZoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.59.0': - resolution: {integrity: sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==} + '@typescript-eslint/visitor-keys@8.64.0': + resolution: {integrity: sha512-mrtuL8Nsn6gi2H4mo5KMTp823M+3Q19Ew/i+Zlikq20tIMm99C3Ez0dCmkWWnxut20esQvTg8aUSEhMcAOXhEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.62.0': - resolution: {integrity: sha512-CY3uyFSRbcQv3nnSv8S0+lDftMVz6P963PoRlxrV7ew/Md564g9ut60PYzdLM5qW4jFn93GBF+Soi90ISAN+GQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@ungap/structured-clone@1.3.3': + resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} '@vitejs/plugin-react@6.0.3': resolution: {integrity: sha512-vmFvco5/QuC2f9Oj+wTk0+9XeDFkHxSamwZKYc7MxYwKICfvUvlMhqKI0VuICPltGqh1neqBKDvO4kes1ya8vg==} @@ -1419,11 +1373,11 @@ packages: babel-plugin-react-compiler: optional: true - '@vitest/expect@4.1.5': - resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==} + '@vitest/expect@4.1.10': + resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} - '@vitest/mocker@4.1.5': - resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==} + '@vitest/mocker@4.1.10': + resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1433,25 +1387,25 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.5': - resolution: {integrity: sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==} + '@vitest/pretty-format@4.1.10': + resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} - '@vitest/runner@4.1.5': - resolution: {integrity: sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==} + '@vitest/runner@4.1.10': + resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} - '@vitest/snapshot@4.1.5': - resolution: {integrity: sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==} + '@vitest/snapshot@4.1.10': + resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} - '@vitest/spy@4.1.5': - resolution: {integrity: sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==} + '@vitest/spy@4.1.10': + resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} - '@vitest/ui@4.1.5': - resolution: {integrity: sha512-3Z9HNFiV0IF1fk0JPiK+7kE1GcaIPefQQIBYur6PM5yFIq6agys3uqP/0t966e1wXfmjbRCHDe7qW236Xjwnag==} + '@vitest/ui@4.1.10': + resolution: {integrity: sha512-EOUqfXHTXtpSHsyLHH40ts3Ue+hRhSGwzwzMlK0dTEOLSDYyOXLyr5JDGmHQWhN2DYI30gw6dVx3cdgM9FZl+Q==} peerDependencies: - vitest: 4.1.5 + vitest: 4.1.10 - '@vitest/utils@4.1.5': - resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==} + '@vitest/utils@4.1.10': + resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} '@xml-tools/parser@1.0.11': resolution: {integrity: sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==} @@ -1460,29 +1414,32 @@ packages: resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==} engines: {node: '>=10.0.0'} - '@xyflow/react@12.10.2': - resolution: {integrity: sha512-CgIi6HwlcHXwlkTpr0fxLv/0sRVNZ8IdwKLzzeCscaYBwpvfcH1QFOCeaTCuEn1FQEs/B8CjnTSjhs8udgmBgQ==} + '@xyflow/react@12.11.2': + resolution: {integrity: sha512-eLAlDWJfWnQEhJwGMjlWdAXO9eYllKpliUmPQlAmOLxz6mExXuzMVDUKLMquixgkrtmMFFtug3jGKmYYld12cA==} peerDependencies: + '@types/react': '>=17' + '@types/react-dom': '>=17' react: '>=17' react-dom: '>=17' + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true - '@xyflow/system@0.0.76': - resolution: {integrity: sha512-hvwvnRS1B3REwVDlWexsq7YQaPZeG3/mKo1jv38UmnpWmxihp14bW6VtEOuHEwJX2FvzFw8k77LyKSk/wiZVNA==} + '@xyflow/system@0.0.79': + resolution: {integrity: sha512-czLyOh91NF0hIzbNzwi8I6GlqG23BHh2435OddfI6uiaLH3xdrdygO93gqgH1Bv9mhy8XPFQJOBn1FTq4LvEWA==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} hasBin: true - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} @@ -1606,8 +1563,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.21: - resolution: {integrity: sha512-Q+rUQ7Uz8AHM7DEaNdwvfFCTq7a43lNTzuS94eiWqwyxfV/wJv+oUivef51T91mmRY4d4A1u9rcSvkeufCVXlA==} + baseline-browser-mapping@2.10.43: + resolution: {integrity: sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -1623,8 +1580,8 @@ packages: bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - brace-expansion@1.1.14: - resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + brace-expansion@1.1.16: + resolution: {integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==} brace-expansion@2.1.0: resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} @@ -1636,8 +1593,8 @@ packages: browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - browserslist@4.28.2: - resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} + browserslist@4.28.6: + resolution: {integrity: sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1648,8 +1605,8 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - builtin-modules@5.1.0: - resolution: {integrity: sha512-c5JxaDrzwRjq3WyJkI1AGR5xy6Gr6udlt7sQPbl09+3ckB+Zo2qqQ2KhCTBr7Q8dHB43bENGYEk4xddrFH/b7A==} + builtin-modules@5.3.0: + resolution: {integrity: sha512-hMQUl2bUFG339QygPM97E+mc8OY1IAchORZxm4a/frcYwKzozMzRVDBwHW0NjOqGElLm2O37AVQE8ikxlZHrMQ==} engines: {node: '>=18.20'} bytes@3.1.2: @@ -1680,8 +1637,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001790: - resolution: {integrity: sha512-bOoxfJPyYo+ds6W0YfptaCWbFnJYjh2Y1Eow5lRv+vI2u8ganPZqNm1JwNh0t2ELQCqIWg4B3dWEusgAmsoyOw==} + caniuse-lite@1.0.30001806: + resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -1740,10 +1697,6 @@ packages: classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} - clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -1803,6 +1756,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1835,10 +1792,6 @@ packages: css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - cssstyle@6.2.0: - resolution: {integrity: sha512-Fm5NvhYathRnXNVndkUsCCuR63DCLVVwGOOwQw782coXFi5HhkXdu289l59HlXZBawsyNccXfWRYvLzcDCdDig==} - engines: {node: '>=20'} - csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -1929,6 +1882,9 @@ packages: dayjs@1.11.20: resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + dayjs@1.11.21: + resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} + debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -1975,6 +1931,10 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + detect-indent@7.0.2: + resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} + engines: {node: '>=12.20'} + detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -2003,8 +1963,8 @@ packages: dom-helpers@3.4.0: resolution: {integrity: sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==} - dompurify@3.4.11: - resolution: {integrity: sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==} + dompurify@3.4.12: + resolution: {integrity: sha512-zQvGet8Z2sWbQhCmfFz/T5QWH2oBmjnqK3qvOjaqaNLrLEF912WamU+ohnTp0TCep/MFVHpdJuCZEdFOdTnEFg==} dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -2023,8 +1983,8 @@ packages: ecc-jsbn@0.1.2: resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} - electron-to-chromium@1.5.344: - resolution: {integrity: sha512-4MxfbmNDm+KPh066EZy+eUnkcDPcZ35wNmOWzFuh/ijvHsve6kbLTLURy88uCNK5FbpN+yk2nQY6BYh1GEt+wg==} + electron-to-chromium@1.5.393: + resolution: {integrity: sha512-kiDJdIUawuEIcp9XoICKp1iTYDEbgguIPq526N1Q7jIQDeQ3CqoMx71025PI/7E48Ddtw2HuWsVjY7afEgNxmg==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -2038,8 +1998,8 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.21.0: - resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==} + enhanced-resolve@5.24.2: + resolution: {integrity: sha512-rpsZEGT1jFuve6QlpyRp9ckQ+kN61hvF9BzCPyMdaKTm8UJce96KBn3sorXOFXlzjPrs3Vc4T1NsSroZ3PxlFw==} engines: {node: '>=10.13.0'} entities@4.5.0: @@ -2057,6 +2017,10 @@ packages: error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + es-abstract-get@1.0.0: + resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} + engines: {node: '>= 0.4'} + es-abstract@1.24.2: resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} engines: {node: '>= 0.4'} @@ -2069,17 +2033,21 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.3.2: - resolution: {integrity: sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==} + es-iterator-helpers@1.4.0: + resolution: {integrity: sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==} engines: {node: '>= 0.4'} - es-module-lexer@2.0.0: - resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-module-lexer@2.3.1: + resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} @@ -2088,8 +2056,8 @@ packages: resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} engines: {node: '>= 0.4'} - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + es-to-primitive@1.3.4: + resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} engines: {node: '>= 0.4'} esast-util-from-estree@2.0.0: @@ -2105,10 +2073,6 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2123,8 +2087,8 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-prettier@5.5.5: - resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} + eslint-plugin-prettier@5.5.6: + resolution: {integrity: sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' @@ -2149,20 +2113,20 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-sonarjs@4.0.3: - resolution: {integrity: sha512-5drkJKLC9qQddIiaATV0e8+ygbUc7b0Ti6VB7M2d3jmKNh3X0RaiIJYTs3dr9xnlhlrxo+/s1FoO3Jgv6O/c7g==} + eslint-plugin-sonarjs@4.2.0: + resolution: {integrity: sha512-bqADfuNtTL7VK6RU29eoiFTtaaBKIpVPuX3bOl+rBpWSBa0zIBVZlqZNZQjfP6s4iXkAJokv5IsD8OsACkwApg==} peerDependencies: eslint: ^8.0.0 || ^9.0.0 || ^10.0.0 - eslint-plugin-unicorn@64.0.0: - resolution: {integrity: sha512-rNZwalHh8i0UfPlhNwg5BTUO1CMdKNmjqe+TgzOTZnpKoi8VBgsW7u9qCHIdpxEzZ1uwrJrPF0uRb7l//K38gA==} - engines: {node: ^20.10.0 || >=21.0.0} + eslint-plugin-unicorn@72.0.0: + resolution: {integrity: sha512-hqO6ksoOHO+ZhdseTuKRVQbx9U7PRO/cv8qAR1mctwzdVO2hYud8uS9luAhp43RJgziYgHAph8eHyipT8GL0ng==} + engines: {node: '>=22'} peerDependencies: - eslint: '>=9.38.0' + eslint: '>=10.4' - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} @@ -2176,9 +2140,9 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@9.39.4: - resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@10.7.0: + resolution: {integrity: sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: jiti: '*' @@ -2190,6 +2154,10 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} @@ -2244,8 +2212,8 @@ packages: resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} engines: {node: '>=4'} - expect-type@1.3.0: - resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} extend@3.0.2: @@ -2317,8 +2285,8 @@ packages: resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} engines: {node: '>= 6'} - framer-motion@12.38.0: - resolution: {integrity: sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==} + framer-motion@12.42.2: + resolution: {integrity: sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -2350,8 +2318,12 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + function-timeout@1.0.2: + resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} + engines: {node: '>=18'} + + function.prototype.name@1.2.0: + resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} engines: {node: '>= 0.4'} functional-red-black-tree@1.0.1: @@ -2408,12 +2380,8 @@ packages: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - - globals@17.5.0: - resolution: {integrity: sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==} + globals@17.7.0: + resolution: {integrity: sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg==} engines: {node: '>=18'} globalthis@1.0.4: @@ -2423,8 +2391,8 @@ packages: globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - goober@2.1.18: - resolution: {integrity: sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==} + goober@2.1.19: + resolution: {integrity: sha512-U7veizMqxyKlM58+Z5j2ngJBH/r9siDmxpvNxSw0PylF6WQvrASJEZrxh1hidRBJc2jqoBVSyOban5u8m+6Rxg==} peerDependencies: csstype: ^3.0.10 @@ -2496,22 +2464,18 @@ packages: resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - http-signature@1.4.0: resolution: {integrity: sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==} engines: {node: '>=0.10'} - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - human-signals@1.1.1: resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} engines: {node: '>=8.12.0'} + identifier-regex@1.1.0: + resolution: {integrity: sha512-SLX4H/vtcYlYnL7XqnuJKHU7Z8517TgsW9nmQiGOgMCjQ8V/deLYu6bEmbGoXe7WMMhc9+EUGyFFneHja8KabA==} + engines: {node: '>=18'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2519,8 +2483,8 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + ignore@7.0.6: + resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} engines: {node: '>= 4'} import-fresh@3.3.1: @@ -2583,8 +2547,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} is-data-view@1.0.2: @@ -2598,6 +2562,10 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-document.all@1.0.0: + resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2625,6 +2593,10 @@ packages: is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-identifier@1.1.0: + resolution: {integrity: sha512-NhOds0mDx9lJu+1lBRO0xbwFo5nobA7GCk/0e5xjr6+6XugX985+0OyGX35BNrTkPAsdLcIKg02HUQJOK8D8kw==} + engines: {node: '>=18'} + is-installed-globally@0.4.0: resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} engines: {node: '>=10'} @@ -2706,8 +2678,8 @@ packages: isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isbot@5.1.39: - resolution: {integrity: sha512-obH0yYahGXdzNxo+djmHhBYThUKDkz565cxkIlt2L9hXfv1NlaLKoDBHo6KxXsYrIXx2RK3x5vY36CfZcobxEw==} + isbot@5.2.1: + resolution: {integrity: sha512-dJ+LpKyClQZ7NG+j3OensC/mAZkGpukE9YUrgPYvAZj2doVL0edfDgywTUh5CXa0o+nW9a1V9e5+CJTX8+SxRw==} engines: {node: '>=18'} isexe@2.0.0: @@ -2723,8 +2695,8 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true js-tokens@4.0.0: @@ -2734,12 +2706,16 @@ packages: resolution: {integrity: sha512-YeLUMlvR4Ou1B119LIaM0r65JvbOBooJDc9yEu0dClb/uSC5P4FrLU8OCCz/HXWvtPoIrR0dRzABTjo1sTN9Bw==} hasBin: true + js-yaml@5.2.1: + resolution: {integrity: sha512-zfLtNfQqxVqq3uaTqSkh4x4hZw3KHobGUA0fJUj4wawW8bsQLTVqpHdXSIzidh7o+4lEW36tANuAGdaFx6Zgnw==} + hasBin: true + jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - jsdom@28.1.0: - resolution: {integrity: sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + jsdom@29.1.1: + resolution: {integrity: sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: @@ -2834,24 +2810,28 @@ packages: engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] lightningcss-linux-arm64-musl@1.32.0: resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] + libc: [musl] lightningcss-linux-x64-gnu@1.32.0: resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [glibc] lightningcss-linux-x64-musl@1.32.0: resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [linux] + libc: [musl] lightningcss-win32-arm64-msvc@1.32.0: resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} @@ -2928,8 +2908,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.3.5: - resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -2942,6 +2922,10 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + make-asynchronous@1.1.0: + resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} + engines: {node: '>=18'} + markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} @@ -3009,6 +2993,9 @@ packages: mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + mdn-data@2.28.1: + resolution: {integrity: sha512-U9w+PzSZ00Z5m9rZ5ARVFL5xOfuCHdKYi/1RRwDCJsboFgJDNT3zT6PIPD7mZQYaQLhsZM3GfDRgSMRHhSmVng==} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -3175,11 +3162,11 @@ packages: monaco-xsd-code-completion@1.1.1: resolution: {integrity: sha512-C70CDCPcO1ukWBTRSde03f5jcILIEQzadmKcXzYFURjL/tlbdErl8+Y1rFz8sE+r8wjQhkA2Z4Ji6PD90zBkuA==} - motion-dom@12.38.0: - resolution: {integrity: sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==} + motion-dom@12.42.2: + resolution: {integrity: sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA==} - motion-utils@12.36.0: - resolution: {integrity: sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==} + motion-utils@12.39.0: + resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} @@ -3188,8 +3175,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.15: - resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -3199,12 +3186,13 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - node-exports-info@1.6.0: - resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} + node-exports-info@1.6.2: + resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} engines: {node: '>= 0.4'} - node-releases@2.0.38: - resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} + node-releases@2.0.51: + resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==} + engines: {node: '>=18'} npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} @@ -3242,8 +3230,9 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - obug@2.1.1: - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + obug@2.1.4: + resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + engines: {node: '>=12.20.0'} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -3271,6 +3260,10 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} + p-event@6.0.1: + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -3279,6 +3272,10 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -3331,8 +3328,8 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} pify@2.3.0: @@ -3347,8 +3344,8 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss@8.5.16: - resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} + postcss@8.5.19: + resolution: {integrity: sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -3359,9 +3356,9 @@ packages: resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} engines: {node: '>=6.0.0'} - prettier-plugin-tailwindcss@0.6.14: - resolution: {integrity: sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==} - engines: {node: '>=14.21.3'} + prettier-plugin-tailwindcss@0.8.1: + resolution: {integrity: sha512-iaFMYqDsE4ffdDkn5qup0j5f2aCEBFZrdrZnvu9QKTlWx/iGPeQ4HHu7b7fCPMxeo9nwQBiOAh2nSypdFYWJkw==} + engines: {node: '>=20.19'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' '@prettier/plugin-hermes': '*' @@ -3373,14 +3370,12 @@ packages: prettier: ^3.0 prettier-plugin-astro: '*' prettier-plugin-css-order: '*' - prettier-plugin-import-sort: '*' prettier-plugin-jsdoc: '*' prettier-plugin-marko: '*' prettier-plugin-multiline-arrays: '*' prettier-plugin-organize-attributes: '*' prettier-plugin-organize-imports: '*' prettier-plugin-sort-imports: '*' - prettier-plugin-style-order: '*' prettier-plugin-svelte: '*' peerDependenciesMeta: '@ianvs/prettier-plugin-sort-imports': @@ -3401,8 +3396,6 @@ packages: optional: true prettier-plugin-css-order: optional: true - prettier-plugin-import-sort: - optional: true prettier-plugin-jsdoc: optional: true prettier-plugin-marko: @@ -3415,13 +3408,11 @@ packages: optional: true prettier-plugin-sort-imports: optional: true - prettier-plugin-style-order: - optional: true prettier-plugin-svelte: optional: true - prettier@3.8.3: - resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + prettier@3.9.5: + resolution: {integrity: sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==} engines: {node: '>=14'} hasBin: true @@ -3443,8 +3434,8 @@ packages: proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} - property-information@7.1.0: - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} proxy-from-env@1.0.0: resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} @@ -3460,8 +3451,12 @@ packages: resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} engines: {node: '>=0.6'} - react-complex-tree@2.6.1: - resolution: {integrity: sha512-RZubW4lh086/R38bbNKpkRpLWG+PdEMBIvYvSUelYNJfv/xaAboRKguWN8hfBvoV9O4NSi6jcMv/AcCm2PbJRg==} + quote-js-string@0.1.0: + resolution: {integrity: sha512-Y3NoRtprEEZQD8RfxMCfS0ZTqc4e+i18OrXEXAvpM6TfC/3y+0L5rNbZiSnbBBEkDfFzbpd8o+cE8q3/anjMGA==} + engines: {node: '>=22'} + + react-complex-tree@2.6.2: + resolution: {integrity: sha512-6SEnSCMpxRlvTp4BUMEuQAv9Fiwo8EPr1HHjpJrk326JHIBw4S3f4M7nLhbzdFqbZ+2xfwKSswOFZaAjKWyWSw==} peerDependencies: react: '>=16.0.0' @@ -3471,13 +3466,13 @@ packages: react: 16.x || 17.x || 18.x || 19.x react-dom: 16.x || 17.x || 18.x || 19.x - react-dom@19.2.5: - resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==} + react-dom@19.2.7: + resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==} peerDependencies: - react: ^19.2.5 + react: ^19.2.7 - react-hotkeys-hook@5.2.4: - resolution: {integrity: sha512-BgKg+A1+TawkYluh5Bo4cTmcgMN5L29uhJbDUQdHwPX+qgXRjIPYU5kIDHyxnAwCkCBiu9V5OpB2mpyeluVF2A==} + react-hotkeys-hook@5.3.3: + resolution: {integrity: sha512-aswgyWUnE25hmhzHTfKDmKzsaSE5DJ4LKaU/o6rQSXkDd/1Bh9TfAFQbHkf6fLy11HvlYkp+cDDarGdhmCDhoQ==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -3501,8 +3496,8 @@ packages: react-router: '>=7.0.0' vite: '>=5.0.0 || >=6.0.0' - react-router@8.0.1: - resolution: {integrity: sha512-5EL/fANovVUhRK50NLS8RYfX0BxrimoKsHWUPPy8v5UEl8i6vzF7e4POo3u+AhPItDwccUAJjMfIOmydxBJmQw==} + react-router@8.2.0: + resolution: {integrity: sha512-uP1LgGNHyilL1u+ZkecQk74DJOKOb6q4NLNYLRJcD/fjoogftNb5/Rj/07o/QBFsY/5MbAKPm1peTCQuVPv9cQ==} engines: {node: '>=22.22.0'} peerDependencies: react: '>=19.2.7' @@ -3517,8 +3512,8 @@ packages: react: '>=16.14.0' react-dom: '>=16.14.0' - react@19.2.5: - resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} + react@19.2.7: + resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==} engines: {node: '>=0.10.0'} readdirp@4.1.2: @@ -3562,16 +3557,12 @@ packages: regexp-to-ast@0.5.0: resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} - regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - regjsparser@0.13.1: - resolution: {integrity: sha512-dLsljMd9sqwRkby8zhO1gSg3PnJIBFid8f4CQj/sXx+7cKx+E7u0PKhZ+U4wmhx7EfmtvnA318oVaIkAB1lRJw==} + regjsparser@0.13.2: + resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} hasBin: true rehype-recma@1.0.0: @@ -3603,12 +3594,16 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + reserved-identifiers@1.2.0: + resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} + engines: {node: '>=18'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve@2.0.0-next.6: - resolution: {integrity: sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA==} + resolve@2.0.0-next.7: + resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} engines: {node: '>= 0.4'} hasBin: true @@ -3623,8 +3618,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rolldown@1.1.3: - resolution: {integrity: sha512-1F1eEtUBtFvcGm1HQ9TiUIUHPQG7mSAODrhIzjxoUEFuo8OcbrGLiVLkevNgj84TE4lnHvnumwFjhJO5Eu135g==} + rolldown@1.1.5: + resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -3675,18 +3670,23 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + serialize-javascript@7.0.6: resolution: {integrity: sha512-ATTK5Q4gFVg0YDp1my2vqygyvhcklD/UV5GIlYHooGTn/NogJqIzpetkD6E5kmuVULqz/S9inUL25XcAgDRJQg==} engines: {node: '>=20.0.0'} - seroval-plugins@1.5.2: - resolution: {integrity: sha512-qpY0Cl+fKYFn4GOf3cMiq6l72CpuVaawb6ILjubOQ+diJ54LfOWaSSPsaswN8DRPIPW4Yq+tE1k5aKd7ILyaFg==} + seroval-plugins@1.5.5: + resolution: {integrity: sha512-+BDhqYM6CEn3x09v44dpa9p6974FuUB2dxk+Ctn04k0cO1Zt6QODTXfmEZK0eBaTe/fJBvP4NMGuNJ+R8T+QMg==} engines: {node: '>=10'} peerDependencies: seroval: ^1.0 - seroval@1.5.2: - resolution: {integrity: sha512-xcRN39BdsnO9Tf+VzsE7b3JyTJASItIV1FVFewJKCFcW4s4haIKS3e6vj8PGB9qBwC7tnuOywQMdv5N4qkzi7Q==} + seroval@1.5.5: + resolution: {integrity: sha512-bSjOuPcwPKLSJNhr9+bZxA20nQxVle5J5MNsYRVE6cIg7KpRLXGupymePavu0jrxlPiPsr4xGZSB8yUY2sH2sw==} engines: {node: '>=10'} set-function-length@1.2.2: @@ -3709,8 +3709,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.9.0: - resolution: {integrity: sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA==} + shell-quote@1.10.0: + resolution: {integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==} engines: {node: '>= 0.4'} side-channel-list@1.0.1: @@ -3725,10 +3725,6 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - side-channel@1.1.1: resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} engines: {node: '>= 0.4'} @@ -3780,8 +3776,8 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - std-env@4.1.0: - resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} @@ -3810,12 +3806,12 @@ packages: string.prototype.repeat@1.0.0: resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} engines: {node: '>= 0.4'} string.prototype.trimstart@1.0.8: @@ -3855,6 +3851,10 @@ packages: style-to-object@1.0.14: resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + super-regex@1.1.0: + resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} + engines: {node: '>=18'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3873,8 +3873,8 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.11.12: - resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} + synckit@0.11.13: + resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} engines: {node: ^14.18.0 || >=16.0.0} systeminformation@5.31.11: @@ -3883,11 +3883,11 @@ packages: os: [darwin, linux, win32, freebsd, openbsd, netbsd, sunos, android] hasBin: true - tailwind-merge@3.5.0: - resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} + tailwind-merge@3.6.0: + resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==} - tailwindcss@4.2.4: - resolution: {integrity: sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==} + tailwindcss@4.3.3: + resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==} tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} @@ -3902,20 +3902,20 @@ packages: throttleit@1.0.1: resolution: {integrity: sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==} + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} + tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - tinyexec@1.1.1: - resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} + tinyexec@1.2.4: + resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} @@ -3927,15 +3927,15 @@ packages: tldts-core@6.1.86: resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==} - tldts-core@7.0.28: - resolution: {integrity: sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==} + tldts-core@7.4.9: + resolution: {integrity: sha512-DxKfPBI52p2msTEu7MPhdpdDTBhhVQg1a/8PjQckeyAvO13eMYElX545grIp6nnTGIMZlRvFZPvFhvI/WIz2Vg==} tldts@6.1.86: resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==} hasBin: true - tldts@7.0.28: - resolution: {integrity: sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==} + tldts@7.4.9: + resolution: {integrity: sha512-3kZ8wQQ/k5DrChD4X4FVvr2D7E5uoRgAqkPyLpSCGUvqOvqu+JEdr3mwMUaVWb+vMHZaKhF5fp2PBigKsui7hA==} hasBin: true tmp@0.2.7: @@ -3950,8 +3950,8 @@ packages: resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} - tough-cookie@6.0.1: - resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} + tough-cookie@6.0.2: + resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==} engines: {node: '>=16'} tr46@6.0.0: @@ -3980,6 +3980,7 @@ packages: tsconfck@3.1.6: resolution: {integrity: sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==} engines: {node: ^18 || >=20} + deprecated: unmaintained hasBin: true peerDependencies: typescript: ^5.0.0 @@ -4011,6 +4012,10 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -4023,12 +4028,12 @@ packages: resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} engines: {node: '>= 0.4'} - typescript-eslint@8.59.0: - resolution: {integrity: sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw==} + typescript-eslint@8.64.0: + resolution: {integrity: sha512-0qg+pDNMnqYzqH9AnNK+39tejHvsShUOUUoRUgtnTGE7QuMZhiFDnozq8nHJVq+Wae6NMLKNWLg5WmkcC/ndyQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -4117,8 +4122,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-plugin-checker@0.14.1: - resolution: {integrity: sha512-Mv8oQc9XYBYf+XkP/riqqQCt8lBP6Iad75PZPho1lHRrpxQI0BwX2gwE10enn4f6Hgc+PvR1F7N38KARcaJtzw==} + vite-plugin-checker@0.14.4: + resolution: {integrity: sha512-Tw0U9UgHIRiZ+Yoe4Gh0RrYoBiCVmO9j4tomVdYr0KUjUsqXMPhqW8ouoSWmOzGp5Iimipbl3bNXZcK7OeP7Qg==} engines: {node: '>=20.19.0'} peerDependencies: '@biomejs/biome': '>=2.4.12' @@ -4161,8 +4166,8 @@ packages: vite: optional: true - vite@8.1.0: - resolution: {integrity: sha512-BuJcQK/56NQTWDGn4ABea3q4SSBdNPWwNZKTkkUpcMPnLoquSYH8llRtSUIgoL1KSCpHt5eghLShn50mH36y7Q==} + vite@8.1.5: + resolution: {integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -4204,20 +4209,20 @@ packages: yaml: optional: true - vitest@4.1.5: - resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==} + vitest@4.1.10: + resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.5 - '@vitest/browser-preview': 4.1.5 - '@vitest/browser-webdriverio': 4.1.5 - '@vitest/coverage-istanbul': 4.1.5 - '@vitest/coverage-v8': 4.1.5 - '@vitest/ui': 4.1.5 + '@vitest/browser-playwright': 4.1.10 + '@vitest/browser-preview': 4.1.10 + '@vitest/browser-webdriverio': 4.1.10 + '@vitest/coverage-istanbul': 4.1.10 + '@vitest/coverage-v8': 4.1.10 + '@vitest/ui': 4.1.10 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -4252,6 +4257,9 @@ packages: warning@3.0.0: resolution: {integrity: sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==} + web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} + webidl-conversions@8.0.1: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} @@ -4276,8 +4284,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + which-typed-array@1.1.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} engines: {node: '>= 0.4'} which@2.0.2: @@ -4312,8 +4320,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.21.0: - resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + ws@8.21.1: + resolution: {integrity: sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -4344,6 +4352,11 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -4370,8 +4383,8 @@ packages: peerDependencies: zod: ^3.25.0 || ^4.0.0 - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} zustand@4.5.7: resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} @@ -4388,8 +4401,8 @@ packages: react: optional: true - zustand@5.0.12: - resolution: {integrity: sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==} + zustand@5.0.14: + resolution: {integrity: sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=18.0.0' @@ -4411,36 +4424,28 @@ packages: snapshots: - '@acemir/cssom@0.9.31': {} - - '@adobe/css-tools@4.4.4': {} + '@adobe/css-tools@4.5.0': {} '@asamuzakjp/css-color@5.1.11': dependencies: '@asamuzakjp/generational-cache': 1.0.1 - '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.1.9(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 - '@asamuzakjp/dom-selector@6.8.1': + '@asamuzakjp/dom-selector@7.1.1': dependencies: + '@asamuzakjp/generational-cache': 1.0.1 '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 css-tree: 3.2.1 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.3.5 '@asamuzakjp/generational-cache@1.0.1': {} '@asamuzakjp/nwsapi@2.3.9': {} - '@babel/code-frame@7.29.0': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -4469,14 +4474,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.29.1': - dependencies: - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - '@babel/generator@7.29.7': dependencies: '@babel/parser': 7.29.7 @@ -4489,12 +4486,10 @@ snapshots: dependencies: '@babel/compat-data': 7.29.7 '@babel/helper-validator-option': 7.29.7 - browserslist: 4.28.2 + browserslist: 4.28.6 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-globals@7.28.0': {} - '@babel/helper-globals@7.29.7': {} '@babel/helper-module-imports@7.29.7': @@ -4513,12 +4508,8 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} - '@babel/helper-validator-identifier@7.29.7': {} '@babel/helper-validator-option@7.29.7': {} @@ -4528,21 +4519,11 @@ snapshots: '@babel/template': 7.29.7 '@babel/types': 7.29.7 - '@babel/parser@7.29.2': - dependencies: - '@babel/types': 7.29.0 - '@babel/parser@7.29.7': dependencies: '@babel/types': 7.29.7 - '@babel/runtime@7.29.2': {} - - '@babel/template@7.28.6': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 + '@babel/runtime@7.29.7': {} '@babel/template@7.29.7': dependencies: @@ -4550,18 +4531,6 @@ snapshots: '@babel/parser': 7.29.7 '@babel/types': 7.29.7 - '@babel/traverse@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.2 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - '@babel/traverse@7.29.7': dependencies: '@babel/code-frame': 7.29.7 @@ -4574,27 +4543,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/types@7.29.0': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/types@7.29.7': dependencies: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@biomejs/cli-darwin-arm64@2.4.13': + '@biomejs/cli-darwin-arm64@2.5.4': optional: true - '@bkrem/react-transition-group@1.3.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@bkrem/react-transition-group@1.3.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: chain-function: 1.0.1 dom-helpers: 3.4.0 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) react-lifecycles-compat: 3.0.4 warning: 3.0.0 @@ -4602,17 +4566,17 @@ snapshots: dependencies: css-tree: 3.2.1 - '@csstools/color-helpers@6.0.2': {} + '@csstools/color-helpers@6.1.0': {} - '@csstools/css-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-color-parser@4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + '@csstools/css-color-parser@4.1.9(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': dependencies: - '@csstools/color-helpers': 6.0.2 - '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/color-helpers': 6.1.0 + '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) '@csstools/css-tokenizer': 4.0.0 @@ -4620,7 +4584,7 @@ snapshots: dependencies: '@csstools/css-tokenizer': 4.0.0 - '@csstools/css-syntax-patches-for-csstree@1.1.3(css-tree@3.2.1)': + '@csstools/css-syntax-patches-for-csstree@1.1.6(css-tree@3.2.1)': optionalDependencies: css-tree: 3.2.1 @@ -4675,71 +4639,64 @@ snapshots: tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@10.7.0(jiti@2.7.0))': dependencies: - eslint: 9.39.4(jiti@2.6.1) + eslint: 10.7.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.2': + '@eslint/config-array@0.23.5': dependencies: - '@eslint/object-schema': 2.1.7 + '@eslint/object-schema': 3.0.5 debug: 4.4.3(supports-color@8.1.1) - minimatch: 3.1.5 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.2': + '@eslint/config-helpers@0.6.0': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 - '@eslint/core@0.17.0': + '@eslint/core@1.2.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.5': + '@eslint/css-tree@4.0.4': dependencies: - ajv: 6.15.0 - debug: 4.4.3(supports-color@8.1.1) - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 5.2.0 - minimatch: 3.1.5 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + mdn-data: 2.28.1 + source-map-js: 1.2.1 - '@eslint/js@9.39.4': {} + '@eslint/js@10.0.1(eslint@10.7.0(jiti@2.7.0))': + optionalDependencies: + eslint: 10.7.0(jiti@2.7.0) - '@eslint/object-schema@2.1.7': {} + '@eslint/object-schema@3.0.5': {} - '@eslint/plugin-kit@0.4.1': + '@eslint/plugin-kit@0.7.2': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 levn: 0.4.1 - '@exodus/bytes@1.15.0': {} + '@exodus/bytes@1.15.1': {} - '@floating-ui/core@1.7.5': + '@floating-ui/core@1.8.0': dependencies: - '@floating-ui/utils': 0.2.11 + '@floating-ui/utils': 0.2.12 - '@floating-ui/dom@1.7.6': + '@floating-ui/dom@1.8.0': dependencies: - '@floating-ui/core': 1.7.5 - '@floating-ui/utils': 0.2.11 + '@floating-ui/core': 1.8.0 + '@floating-ui/utils': 0.2.12 - '@floating-ui/utils@0.2.11': {} + '@floating-ui/utils@0.2.12': {} - '@frankframework/doc-library-core@1.0.3': {} + '@frankframework/doc-library-core@1.0.6': {} - '@frankframework/doc-library-react@1.0.3(react@19.2.5)': + '@frankframework/doc-library-react@1.0.4(react@19.2.7)': dependencies: - '@frankframework/doc-library-core': 1.0.3 - react: 19.2.5 + '@frankframework/doc-library-core': 1.0.6 + react: 19.2.7 '@humanfs/core@0.19.2': dependencies: @@ -4787,11 +4744,11 @@ snapshots: '@mdx-js/mdx@3.1.1': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdx': 2.0.13 - acorn: 8.16.0 + '@types/hast': 3.0.5 + '@types/mdx': 2.0.14 + acorn: 8.17.0 collapse-white-space: 2.1.0 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 @@ -4800,7 +4757,7 @@ snapshots: hast-util-to-jsx-runtime: 2.3.6 markdown-extensions: 2.0.0 recma-build-jsx: 1.0.0 - recma-jsx: 1.0.1(acorn@8.16.0) + recma-jsx: 1.0.1(acorn@8.17.0) recma-stringify: 1.0.0 rehype-recma: 1.0.0 remark-mdx: 3.1.1 @@ -4815,16 +4772,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@mdx-js/react@3.1.1(@types/react@19.2.14)(react@19.2.5)': + '@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.7)': dependencies: - '@types/mdx': 2.0.13 - '@types/react': 19.2.14 - react: 19.2.5 + '@types/mdx': 2.0.14 + '@types/react': 19.2.17 + react: 19.2.7 '@mdx-js/rollup@3.1.1(rollup@4.60.2)': dependencies: '@mdx-js/mdx': 3.1.1 - '@rollup/pluginutils': 5.3.0(rollup@4.60.2) + '@rollup/pluginutils': 5.4.0(rollup@4.60.2) rollup: 4.60.2 source-map: 0.7.6 vfile: 6.0.3 @@ -4840,195 +4797,194 @@ snapshots: '@tybys/wasm-util': 0.10.3 optional: true - '@oxc-project/types@0.137.0': {} + '@oxc-project/types@0.139.0': {} '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/core@0.2.9': {} + '@pkgr/core@0.3.6': {} '@polka/url@1.0.0-next.29': {} - '@prettier/plugin-xml@3.4.2(prettier@3.8.3)': + '@prettier/plugin-xml@3.4.2(prettier@3.9.5)': dependencies: '@xml-tools/parser': 1.0.11 - prettier: 3.8.3 - - '@radix-ui/primitive@1.1.3': {} - - '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + prettier: 3.9.5 + + '@radix-ui/primitive@1.1.5': {} + + '@radix-ui/react-accordion@1.2.16(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.5 + '@radix-ui/react-collapsible': 1.1.16(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-collection': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.2.0(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-direction': 1.1.2(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - - '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-collapsible@1.1.16(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.5 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.2.0(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-presence': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-collection@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.2.0(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.5)': + '@radix-ui/react-compose-refs@1.1.3(@types/react@19.2.17)(react@19.2.7)': dependencies: - react: 19.2.5 + react: 19.2.7 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@radix-ui/react-context@1.1.2(@types/react@19.2.14)(react@19.2.5)': + '@radix-ui/react-context@1.2.0(@types/react@19.2.17)(react@19.2.7)': dependencies: - react: 19.2.5 + react: 19.2.7 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@radix-ui/react-direction@1.1.1(@types/react@19.2.14)(react@19.2.5)': + '@radix-ui/react-direction@1.1.2(@types/react@19.2.17)(react@19.2.7)': dependencies: - react: 19.2.5 + react: 19.2.7 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@radix-ui/react-id@1.1.1(@types/react@19.2.14)(react@19.2.5)': + '@radix-ui/react-id@1.1.2(@types/react@19.2.17)(react@19.2.7)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-presence@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@radix-ui/react-primitive@2.1.7(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) - '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.5)': + '@radix-ui/react-slot@1.3.0(@types/react@19.2.17)(react@19.2.7)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 + '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.5)': + '@radix-ui/react-use-controllable-state@1.2.3(@types/react@19.2.17)(react@19.2.7)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 + '@radix-ui/react-use-effect-event': 0.0.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.5)': + '@radix-ui/react-use-effect-event@0.0.3(@types/react@19.2.17)(react@19.2.7)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 + '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.5)': + '@radix-ui/react-use-layout-effect@1.1.2(@types/react@19.2.17)(react@19.2.7)': dependencies: - react: 19.2.5 + react: 19.2.7 optionalDependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@rolldown/binding-android-arm64@1.1.3': + '@rolldown/binding-android-arm64@1.1.5': optional: true - '@rolldown/binding-darwin-arm64@1.1.3': + '@rolldown/binding-darwin-arm64@1.1.5': optional: true - '@rolldown/binding-darwin-x64@1.1.3': + '@rolldown/binding-darwin-x64@1.1.5': optional: true - '@rolldown/binding-freebsd-x64@1.1.3': + '@rolldown/binding-freebsd-x64@1.1.5': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.1.3': + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': optional: true - '@rolldown/binding-linux-arm64-gnu@1.1.3': + '@rolldown/binding-linux-arm64-gnu@1.1.5': optional: true - '@rolldown/binding-linux-arm64-musl@1.1.3': + '@rolldown/binding-linux-arm64-musl@1.1.5': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.1.3': + '@rolldown/binding-linux-ppc64-gnu@1.1.5': optional: true - '@rolldown/binding-linux-s390x-gnu@1.1.3': + '@rolldown/binding-linux-s390x-gnu@1.1.5': optional: true - '@rolldown/binding-linux-x64-gnu@1.1.3': + '@rolldown/binding-linux-x64-gnu@1.1.5': optional: true - '@rolldown/binding-linux-x64-musl@1.1.3': + '@rolldown/binding-linux-x64-musl@1.1.5': optional: true - '@rolldown/binding-openharmony-arm64@1.1.3': + '@rolldown/binding-openharmony-arm64@1.1.5': optional: true - '@rolldown/binding-wasm32-wasi@1.1.3': + '@rolldown/binding-wasm32-wasi@1.1.5': dependencies: '@emnapi/core': 1.11.1 '@emnapi/runtime': 1.11.1 '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true - '@rolldown/binding-win32-arm64-msvc@1.1.3': + '@rolldown/binding-win32-arm64-msvc@1.1.5': optional: true - '@rolldown/binding-win32-x64-msvc@1.1.3': + '@rolldown/binding-win32-x64-msvc@1.1.5': optional: true '@rolldown/pluginutils@1.0.1': {} - '@rollup/pluginutils@5.3.0(rollup@4.60.2)': + '@rollup/pluginutils@5.4.0(rollup@4.60.2)': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-walker: 2.0.2 - picomatch: 4.0.4 + picomatch: 4.0.5 optionalDependencies: rollup: 4.60.2 @@ -5041,6 +4997,9 @@ snapshots: '@rollup/rollup-darwin-arm64@4.60.2': optional: true + '@rollup/rollup-darwin-arm64@4.62.2': + optional: true + '@rollup/rollup-darwin-x64@4.60.2': optional: true @@ -5086,6 +5045,9 @@ snapshots: '@rollup/rollup-linux-x64-gnu@4.60.2': optional: true + '@rollup/rollup-linux-x64-gnu@4.62.2': + optional: true + '@rollup/rollup-linux-x64-musl@4.60.2': optional: true @@ -5107,51 +5069,51 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.60.2': optional: true - '@solid-primitives/event-listener@2.4.5(solid-js@1.9.12)': + '@solid-primitives/event-listener@2.4.6(solid-js@1.9.12)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@1.9.12) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.12) solid-js: 1.9.12 - '@solid-primitives/keyboard@1.3.5(solid-js@1.9.12)': + '@solid-primitives/keyboard@1.3.7(solid-js@1.9.12)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.12) - '@solid-primitives/rootless': 1.5.3(solid-js@1.9.12) - '@solid-primitives/utils': 6.4.0(solid-js@1.9.12) + '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.12) + '@solid-primitives/rootless': 1.5.4(solid-js@1.9.12) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.12) solid-js: 1.9.12 - '@solid-primitives/resize-observer@2.1.5(solid-js@1.9.12)': + '@solid-primitives/resize-observer@2.2.0(solid-js@1.9.12)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.12) - '@solid-primitives/rootless': 1.5.3(solid-js@1.9.12) - '@solid-primitives/static-store': 0.1.3(solid-js@1.9.12) - '@solid-primitives/utils': 6.4.0(solid-js@1.9.12) + '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.12) + '@solid-primitives/rootless': 1.5.4(solid-js@1.9.12) + '@solid-primitives/static-store': 0.1.4(solid-js@1.9.12) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.12) solid-js: 1.9.12 - '@solid-primitives/rootless@1.5.3(solid-js@1.9.12)': + '@solid-primitives/rootless@1.5.4(solid-js@1.9.12)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@1.9.12) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.12) solid-js: 1.9.12 - '@solid-primitives/static-store@0.1.3(solid-js@1.9.12)': + '@solid-primitives/static-store@0.1.4(solid-js@1.9.12)': dependencies: - '@solid-primitives/utils': 6.4.0(solid-js@1.9.12) + '@solid-primitives/utils': 6.4.1(solid-js@1.9.12) solid-js: 1.9.12 - '@solid-primitives/utils@6.4.0(solid-js@1.9.12)': + '@solid-primitives/utils@6.4.1(solid-js@1.9.12)': dependencies: solid-js: 1.9.12 '@standard-schema/spec@1.1.0': {} - '@stylistic/eslint-plugin@5.10.0(eslint@9.39.4(jiti@2.6.1))': + '@stylistic/eslint-plugin@5.10.0(eslint@10.7.0(jiti@2.7.0))': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) - '@typescript-eslint/types': 8.59.0 - eslint: 9.39.4(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@typescript-eslint/types': 8.64.0 + eslint: 10.7.0(jiti@2.7.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 - picomatch: 4.0.4 + picomatch: 4.0.5 '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.29.7)': dependencies: @@ -5210,7 +5172,7 @@ snapshots: '@svgr/hast-util-to-babel-ast@8.0.0': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.7 entities: 4.5.0 '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.9.3))': @@ -5223,120 +5185,120 @@ snapshots: transitivePeerDependencies: - supports-color - '@tailwindcss/node@4.2.4': + '@tailwindcss/node@4.3.3': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.21.0 - jiti: 2.6.1 + enhanced-resolve: 5.24.2 + jiti: 2.7.0 lightningcss: 1.32.0 magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.2.4 + tailwindcss: 4.3.3 - '@tailwindcss/oxide-android-arm64@4.2.4': + '@tailwindcss/oxide-android-arm64@4.3.3': optional: true - '@tailwindcss/oxide-darwin-arm64@4.2.4': + '@tailwindcss/oxide-darwin-arm64@4.3.3': optional: true - '@tailwindcss/oxide-darwin-x64@4.2.4': + '@tailwindcss/oxide-darwin-x64@4.3.3': optional: true - '@tailwindcss/oxide-freebsd-x64@4.2.4': + '@tailwindcss/oxide-freebsd-x64@4.3.3': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.2.4': + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.2.4': + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.2.4': + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.2.4': + '@tailwindcss/oxide-linux-x64-musl@4.3.3': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.2.4': + '@tailwindcss/oxide-wasm32-wasi@4.3.3': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.2.4': + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.2.4': + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': optional: true - '@tailwindcss/oxide@4.2.4': + '@tailwindcss/oxide@4.3.3': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.2.4 - '@tailwindcss/oxide-darwin-arm64': 4.2.4 - '@tailwindcss/oxide-darwin-x64': 4.2.4 - '@tailwindcss/oxide-freebsd-x64': 4.2.4 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.4 - '@tailwindcss/oxide-linux-arm64-gnu': 4.2.4 - '@tailwindcss/oxide-linux-arm64-musl': 4.2.4 - '@tailwindcss/oxide-linux-x64-gnu': 4.2.4 - '@tailwindcss/oxide-linux-x64-musl': 4.2.4 - '@tailwindcss/oxide-wasm32-wasi': 4.2.4 - '@tailwindcss/oxide-win32-arm64-msvc': 4.2.4 - '@tailwindcss/oxide-win32-x64-msvc': 4.2.4 - - '@tailwindcss/vite@4.2.4(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1))': - dependencies: - '@tailwindcss/node': 4.2.4 - '@tailwindcss/oxide': 4.2.4 - tailwindcss: 4.2.4 - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + '@tailwindcss/oxide-android-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-x64': 4.3.3 + '@tailwindcss/oxide-freebsd-x64': 4.3.3 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.3 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-x64-musl': 4.3.3 + '@tailwindcss/oxide-wasm32-wasi': 4.3.3 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 + + '@tailwindcss/vite@4.3.3(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0))': + dependencies: + '@tailwindcss/node': 4.3.3 + '@tailwindcss/oxide': 4.3.3 + tailwindcss: 4.3.3 + vite: 8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0) '@tanstack/devtools-client@0.0.5': dependencies: - '@tanstack/devtools-event-client': 0.4.3 + '@tanstack/devtools-event-client': 0.4.4 '@tanstack/devtools-client@0.0.6': dependencies: - '@tanstack/devtools-event-client': 0.4.3 + '@tanstack/devtools-event-client': 0.4.4 '@tanstack/devtools-event-bus@0.4.0': dependencies: - ws: 8.21.0 + ws: 8.21.1 transitivePeerDependencies: - bufferutil - utf-8-validate '@tanstack/devtools-event-bus@0.4.1': dependencies: - ws: 8.21.0 + ws: 8.21.1 transitivePeerDependencies: - bufferutil - utf-8-validate - '@tanstack/devtools-event-client@0.4.3': {} + '@tanstack/devtools-event-client@0.4.4': {} '@tanstack/devtools-ui@0.5.0(csstype@3.2.3)(solid-js@1.9.12)': dependencies: clsx: 2.1.1 - dayjs: 1.11.20 - goober: 2.1.18(csstype@3.2.3) + dayjs: 1.11.21 + goober: 2.1.19(csstype@3.2.3) solid-js: 1.9.12 transitivePeerDependencies: - csstype - '@tanstack/devtools-vite@0.4.1(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1))': + '@tanstack/devtools-vite@0.4.1(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.7 - '@babel/generator': 7.29.1 - '@babel/parser': 7.29.2 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 '@tanstack/devtools-client': 0.0.5 '@tanstack/devtools-event-bus': 0.4.0 chalk: 5.6.2 launch-editor: 2.14.1 - picomatch: 4.0.4 - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + picomatch: 4.0.5 + vite: 8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0) transitivePeerDependencies: - bufferutil - supports-color @@ -5344,27 +5306,27 @@ snapshots: '@tanstack/devtools@0.10.14(csstype@3.2.3)(solid-js@1.9.12)': dependencies: - '@solid-primitives/event-listener': 2.4.5(solid-js@1.9.12) - '@solid-primitives/keyboard': 1.3.5(solid-js@1.9.12) - '@solid-primitives/resize-observer': 2.1.5(solid-js@1.9.12) + '@solid-primitives/event-listener': 2.4.6(solid-js@1.9.12) + '@solid-primitives/keyboard': 1.3.7(solid-js@1.9.12) + '@solid-primitives/resize-observer': 2.2.0(solid-js@1.9.12) '@tanstack/devtools-client': 0.0.6 '@tanstack/devtools-event-bus': 0.4.1 '@tanstack/devtools-ui': 0.5.0(csstype@3.2.3)(solid-js@1.9.12) clsx: 2.1.1 - goober: 2.1.18(csstype@3.2.3) + goober: 2.1.19(csstype@3.2.3) solid-js: 1.9.12 transitivePeerDependencies: - bufferutil - csstype - utf-8-validate - '@tanstack/react-devtools@0.9.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(csstype@3.2.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)': + '@tanstack/react-devtools@0.9.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(solid-js@1.9.12)': dependencies: '@tanstack/devtools': 0.10.14(csstype@3.2.3)(solid-js@1.9.12) - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) transitivePeerDependencies: - bufferutil - csstype @@ -5373,8 +5335,8 @@ snapshots: '@testing-library/dom@10.4.1': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/runtime': 7.29.2 + '@babel/code-frame': 7.29.7 + '@babel/runtime': 7.29.7 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -5384,22 +5346,22 @@ snapshots: '@testing-library/jest-dom@6.9.1': dependencies: - '@adobe/css-tools': 4.4.4 + '@adobe/css-tools': 4.5.0 aria-query: 5.3.2 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 '@testing-library/dom': 10.4.1 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': dependencies: @@ -5446,13 +5408,17 @@ snapshots: '@types/deep-eql@4.0.2': {} + '@types/esrecurse@4.3.1': {} + '@types/estree-jsx@1.0.5': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/estree@1.0.8': {} - '@types/hast@3.0.4': + '@types/estree@1.0.9': {} + + '@types/hast@3.0.5': dependencies: '@types/unist': 3.0.3 @@ -5462,19 +5428,19 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/mdx@2.0.13': {} + '@types/mdx@2.0.14': {} '@types/ms@2.1.0': {} - '@types/node@20.19.39': + '@types/node@20.19.43': dependencies: undici-types: 6.21.0 - '@types/react-dom@19.2.3(@types/react@19.2.14)': + '@types/react-dom@19.2.3(@types/react@19.2.17)': dependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.17 - '@types/react@19.2.14': + '@types/react@19.2.17': dependencies: csstype: 3.2.3 @@ -5491,232 +5457,153 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.59.0 - '@typescript-eslint/type-utils': 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.59.0 - eslint: 9.39.4(jiti@2.6.1) - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@8.62.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.64.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.62.0 - '@typescript-eslint/type-utils': 8.62.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.62.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.62.0 - eslint: 9.39.4(jiti@2.6.1) - ignore: 7.0.5 + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/type-utils': 8.64.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.64.0 + eslint: 10.7.0(jiti@2.7.0) + ignore: 7.0.6 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.64.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.59.0 - '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/typescript-estree': 8.59.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.59.0 + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.64.0 debug: 4.4.3(supports-color@8.1.1) - eslint: 9.39.4(jiti@2.6.1) + eslint: 10.7.0(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.59.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.64.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@5.9.3) - '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/tsconfig-utils': 8.64.0(typescript@5.9.3) + '@typescript-eslint/types': 8.64.0 debug: 4.4.3(supports-color@8.1.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.62.0(typescript@5.9.3)': + '@typescript-eslint/scope-manager@8.64.0': dependencies: - '@typescript-eslint/tsconfig-utils': 8.62.0(typescript@5.9.3) - '@typescript-eslint/types': 8.62.0 - debug: 4.4.3(supports-color@8.1.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.59.0': - dependencies: - '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/visitor-keys': 8.59.0 - - '@typescript-eslint/scope-manager@8.62.0': - dependencies: - '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/visitor-keys': 8.62.0 - - '@typescript-eslint/tsconfig-utils@8.59.0(typescript@5.9.3)': - dependencies: - typescript: 5.9.3 + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/visitor-keys': 8.64.0 - '@typescript-eslint/tsconfig-utils@8.62.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.64.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.64.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/typescript-estree': 8.59.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 9.39.4(jiti@2.6.1) + eslint: 10.7.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.62.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/typescript-estree': 8.62.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.62.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.39.4(jiti@2.6.1) - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@8.59.0': {} + '@typescript-eslint/types@8.64.0': {} - '@typescript-eslint/types@8.62.0': {} - - '@typescript-eslint/typescript-estree@8.59.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.64.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.59.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.59.0(typescript@5.9.3) - '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/visitor-keys': 8.59.0 + '@typescript-eslint/project-service': 8.64.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.64.0(typescript@5.9.3) + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/visitor-keys': 8.64.0 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 - semver: 7.7.4 - tinyglobby: 0.2.16 - ts-api-utils: 2.5.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.62.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.62.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.62.0(typescript@5.9.3) - '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/visitor-keys': 8.62.0 - debug: 4.4.3(supports-color@8.1.1) - minimatch: 10.2.5 - semver: 7.7.4 - tinyglobby: 0.2.16 + semver: 7.8.5 + tinyglobby: 0.2.17 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.64.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.59.0 - '@typescript-eslint/types': 8.59.0 - '@typescript-eslint/typescript-estree': 8.59.0(typescript@5.9.3) - eslint: 9.39.4(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.64.0 + '@typescript-eslint/types': 8.64.0 + '@typescript-eslint/typescript-estree': 8.64.0(typescript@5.9.3) + eslint: 10.7.0(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.62.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/visitor-keys@8.64.0': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.62.0 - '@typescript-eslint/types': 8.62.0 - '@typescript-eslint/typescript-estree': 8.62.0(typescript@5.9.3) - eslint: 9.39.4(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.59.0': - dependencies: - '@typescript-eslint/types': 8.59.0 + '@typescript-eslint/types': 8.64.0 eslint-visitor-keys: 5.0.1 - '@typescript-eslint/visitor-keys@8.62.0': - dependencies: - '@typescript-eslint/types': 8.62.0 - eslint-visitor-keys: 5.0.1 - - '@ungap/structured-clone@1.3.0': {} + '@ungap/structured-clone@1.3.3': {} - '@vitejs/plugin-react@6.0.3(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1))': + '@vitejs/plugin-react@6.0.3(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0))': dependencies: '@rolldown/pluginutils': 1.0.1 - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + vite: 8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0) - '@vitest/expect@4.1.5': + '@vitest/expect@4.1.10': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.5(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1))': + '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.5 + '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + vite: 8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0) - '@vitest/pretty-format@4.1.5': + '@vitest/pretty-format@4.1.10': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.5': + '@vitest/runner@4.1.10': dependencies: - '@vitest/utils': 4.1.5 + '@vitest/utils': 4.1.10 pathe: 2.0.3 - '@vitest/snapshot@4.1.5': + '@vitest/snapshot@4.1.10': dependencies: - '@vitest/pretty-format': 4.1.5 - '@vitest/utils': 4.1.5 + '@vitest/pretty-format': 4.1.10 + '@vitest/utils': 4.1.10 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.5': {} + '@vitest/spy@4.1.10': {} - '@vitest/ui@4.1.5(vitest@4.1.5)': + '@vitest/ui@4.1.10(vitest@4.1.10)': dependencies: - '@vitest/utils': 4.1.5 + '@vitest/utils': 4.1.10 fflate: 0.8.3 flatted: 3.4.2 pathe: 2.0.3 sirv: 3.0.2 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vitest: 4.1.5(@types/node@20.19.39)(@vitest/ui@4.1.5)(jsdom@28.1.0)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) + vitest: 4.1.10(@types/node@20.19.43)(@vitest/ui@4.1.10)(jsdom@29.1.1)(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0)) - '@vitest/utils@4.1.5': + '@vitest/utils@4.1.10': dependencies: - '@vitest/pretty-format': 4.1.5 + '@vitest/pretty-format': 4.1.10 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -5726,18 +5613,20 @@ snapshots: '@xmldom/xmldom@0.8.13': {} - '@xyflow/react@12.10.2(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@xyflow/react@12.11.2(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': dependencies: - '@xyflow/system': 0.0.76 + '@xyflow/system': 0.0.79 classcat: 5.0.5 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - zustand: 4.5.7(@types/react@19.2.14)(react@19.2.5) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + zustand: 4.5.7(@types/react@19.2.17)(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) transitivePeerDependencies: - - '@types/react' - immer - '@xyflow/system@0.0.76': + '@xyflow/system@0.0.79': dependencies: '@types/d3-drag': 3.0.7 '@types/d3-interpolate': 3.0.4 @@ -5749,13 +5638,11 @@ snapshots: d3-selection: 3.0.0 d3-zoom: 3.0.0 - acorn-jsx@5.3.2(acorn@8.16.0): + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: - acorn: 8.16.0 + acorn: 8.17.0 - acorn@8.16.0: {} - - agent-base@7.1.4: {} + acorn@8.17.0: {} ajv@6.15.0: dependencies: @@ -5764,16 +5651,16 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - allotment@1.20.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + allotment@1.20.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: classnames: 2.5.1 eventemitter3: 5.0.4 fast-deep-equal: 3.1.3 lodash.clamp: 4.0.3 lodash.debounce: 4.0.8 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - usehooks-ts: 3.1.1(react@19.2.5) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + usehooks-ts: 3.1.1(react@19.2.7) ansi-escapes@7.3.0: dependencies: @@ -5812,7 +5699,7 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 es-abstract: 1.24.2 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 is-string: 1.1.1 math-intrinsics: 1.1.0 @@ -5823,7 +5710,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.2 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 es-shim-unscopables: 1.1.0 array.prototype.flat@1.3.3: @@ -5890,7 +5777,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.10.21: {} + baseline-browser-mapping@2.10.43: {} bcrypt-pbkdf@1.0.2: dependencies: @@ -5904,7 +5791,7 @@ snapshots: bluebird@3.7.2: {} - brace-expansion@1.1.14: + brace-expansion@1.1.16: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 @@ -5919,13 +5806,13 @@ snapshots: browser-stdout@1.3.1: {} - browserslist@4.28.2: + browserslist@4.28.6: dependencies: - baseline-browser-mapping: 2.10.21 - caniuse-lite: 1.0.30001790 - electron-to-chromium: 1.5.344 - node-releases: 2.0.38 - update-browserslist-db: 1.2.3(browserslist@4.28.2) + baseline-browser-mapping: 2.10.43 + caniuse-lite: 1.0.30001806 + electron-to-chromium: 1.5.393 + node-releases: 2.0.51 + update-browserslist-db: 1.2.3(browserslist@4.28.6) buffer@5.7.1: dependencies: @@ -5934,7 +5821,7 @@ snapshots: builtin-modules@3.3.0: {} - builtin-modules@5.1.0: {} + builtin-modules@5.3.0: {} bytes@3.1.2: {} @@ -5961,7 +5848,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001790: {} + caniuse-lite@1.0.30001806: {} caseless@0.12.0: {} @@ -6006,10 +5893,6 @@ snapshots: classnames@2.5.1: {} - clean-regexp@1.0.0: - dependencies: - escape-string-regexp: 1.0.5 - cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -6060,20 +5943,22 @@ snapshots: concat-map@0.0.1: {} + convert-hrtime@5.0.0: {} + convert-source-map@2.0.0: {} cookie-es@3.1.1: {} core-js-compat@3.49.0: dependencies: - browserslist: 4.28.2 + browserslist: 4.28.6 core-util-is@1.0.2: {} cosmiconfig@8.3.6(typescript@5.9.3): dependencies: import-fresh: 3.3.1 - js-yaml: 5.2.0 + js-yaml: 5.2.1 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: @@ -6092,13 +5977,6 @@ snapshots: css.escape@1.5.1: {} - cssstyle@6.2.0: - dependencies: - '@asamuzakjp/css-color': 5.1.11 - '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) - css-tree: 3.2.1 - lru-cache: 11.3.5 - csstype@3.2.3: {} cypress-multi-reporters@2.0.5(mocha@11.7.6): @@ -6234,6 +6112,8 @@ snapshots: dayjs@1.11.20: {} + dayjs@1.11.21: {} + debug@3.2.7(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -6272,6 +6152,8 @@ snapshots: dequal@2.0.3: {} + detect-indent@7.0.2: {} + detect-libc@2.1.2: {} devlop@1.1.0: @@ -6292,9 +6174,9 @@ snapshots: dom-helpers@3.4.0: dependencies: - '@babel/runtime': 7.29.2 + '@babel/runtime': 7.29.7 - dompurify@3.4.11: + dompurify@3.4.12: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -6318,7 +6200,7 @@ snapshots: jsbn: 0.1.1 safer-buffer: 2.1.2 - electron-to-chromium@1.5.344: {} + electron-to-chromium@1.5.393: {} emoji-regex@10.6.0: {} @@ -6330,7 +6212,7 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.21.0: + enhanced-resolve@5.24.2: dependencies: graceful-fs: 4.2.11 tapable: 2.3.3 @@ -6345,6 +6227,13 @@ snapshots: dependencies: is-arrayish: 0.2.1 + es-abstract-get@1.0.0: + dependencies: + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + is-callable: 1.2.7 + object-inspect: 1.13.4 + es-abstract@1.24.2: dependencies: array-buffer-byte-length: 1.0.2 @@ -6357,10 +6246,10 @@ snapshots: data-view-byte-offset: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 + es-to-primitive: 1.3.4 + function.prototype.name: 1.2.0 get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 @@ -6369,7 +6258,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.3 + hasown: 2.0.4 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -6392,21 +6281,21 @@ snapshots: safe-regex-test: 1.1.0 set-proto: 1.0.0 stop-iteration-iterator: 1.1.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 + string.prototype.trim: 1.2.11 + string.prototype.trimend: 1.0.10 string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.3 typed-array-byte-length: 1.0.3 typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 + typed-array-length: 1.0.8 unbox-primitive: 1.1.0 - which-typed-array: 1.1.20 + which-typed-array: 1.1.22 es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-iterator-helpers@1.3.2: + es-iterator-helpers@1.4.0: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -6425,12 +6314,16 @@ snapshots: iterator.prototype: 1.1.5 math-intrinsics: 1.1.0 - es-module-lexer@2.0.0: {} + es-module-lexer@2.3.1: {} es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 @@ -6440,10 +6333,13 @@ snapshots: es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.3 + hasown: 2.0.4 - es-to-primitive@1.3.0: + es-to-primitive@1.3.4: dependencies: + es-abstract-get: 1.0.0 + es-define-property: 1.0.1 + es-errors: 1.3.0 is-callable: 1.2.7 is-date-object: 1.1.0 is-symbol: 1.1.1 @@ -6458,7 +6354,7 @@ snapshots: esast-util-from-js@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - acorn: 8.16.0 + acorn: 8.17.0 esast-util-from-estree: 2.0.0 vfile-message: 4.0.3 @@ -6466,96 +6362,101 @@ snapshots: escape-html@1.0.3: {} - escape-string-regexp@1.0.5: {} - escape-string-regexp@4.0.0: {} escape-string-regexp@5.0.0: {} - eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@10.7.0(jiti@2.7.0)): dependencies: - eslint: 9.39.4(jiti@2.6.1) + eslint: 10.7.0(jiti@2.7.0) - eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1))(prettier@3.8.3): + eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.7.0(jiti@2.7.0)))(eslint@10.7.0(jiti@2.7.0))(prettier@3.9.5): dependencies: - eslint: 9.39.4(jiti@2.6.1) - prettier: 3.8.3 + eslint: 10.7.0(jiti@2.7.0) + prettier: 3.9.5 prettier-linter-helpers: 1.0.1 - synckit: 0.11.12 + synckit: 0.11.13 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@9.39.4(jiti@2.6.1)) + eslint-config-prettier: 10.1.8(eslint@10.7.0(jiti@2.7.0)) - eslint-plugin-react-hooks@7.1.1(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-react-hooks@7.1.1(eslint@10.7.0(jiti@2.7.0)): dependencies: '@babel/core': 7.29.7 - '@babel/parser': 7.29.2 - eslint: 9.39.4(jiti@2.6.1) + '@babel/parser': 7.29.7 + eslint: 10.7.0(jiti@2.7.0) hermes-parser: 0.25.1 - zod: 4.3.6 - zod-validation-error: 4.0.2(zod@4.3.6) + zod: 4.4.3 + zod-validation-error: 4.0.2(zod@4.4.3) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-react@7.37.5(eslint@10.7.0(jiti@2.7.0)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.3.2 - eslint: 9.39.4(jiti@2.6.1) + es-iterator-helpers: 1.4.0 + eslint: 10.7.0(jiti@2.7.0) estraverse: 5.3.0 - hasown: 2.0.3 + hasown: 2.0.4 jsx-ast-utils: 3.3.5 minimatch: 3.1.5 object.entries: 1.1.9 object.fromentries: 2.0.8 object.values: 1.2.1 prop-types: 15.8.1 - resolve: 2.0.0-next.6 + resolve: 2.0.0-next.7 semver: 6.3.1 string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-sonarjs@4.0.3(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-sonarjs@4.2.0(eslint@10.7.0(jiti@2.7.0)): dependencies: '@eslint-community/regexpp': 4.12.2 builtin-modules: 3.3.0 bytes: 3.1.2 - eslint: 9.39.4(jiti@2.6.1) + eslint: 10.7.0(jiti@2.7.0) functional-red-black-tree: 1.0.1 - globals: 17.5.0 + globals: 17.7.0 jsx-ast-utils-x: 0.1.0 lodash.merge: 4.6.2 minimatch: 10.2.5 scslre: 0.3.0 - semver: 7.7.4 + semver: 7.8.5 ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 + yaml: 2.9.0 - eslint-plugin-unicorn@64.0.0(eslint@9.39.4(jiti@2.6.1)): + eslint-plugin-unicorn@72.0.0(eslint@10.7.0(jiti@2.7.0)): dependencies: - '@babel/helper-validator-identifier': 7.28.5 - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) + '@eslint/css-tree': 4.0.4 + browserslist: 4.28.6 change-case: 5.4.4 ci-info: 4.4.0 - clean-regexp: 1.0.0 core-js-compat: 3.49.0 - eslint: 9.39.4(jiti@2.6.1) + detect-indent: 7.0.2 + entities: 4.5.0 + eslint: 10.7.0(jiti@2.7.0) find-up-simple: 1.0.1 - globals: 17.5.0 + globals: 17.7.0 indent-string: 5.0.0 is-builtin-module: 5.0.0 - jsesc: 3.1.0 + is-identifier: 1.1.0 pluralize: 8.0.0 - regexp-tree: 0.1.27 - regjsparser: 0.13.1 - semver: 7.7.4 + quote-js-string: 0.1.0 + regjsparser: 0.13.2 + reserved-identifiers: 1.2.0 + semver: 7.8.5 strip-indent: 4.1.1 + yaml: 2.9.0 - eslint-scope@8.4.0: + eslint-scope@9.1.2: dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 @@ -6565,28 +6466,25 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@9.39.4(jiti@2.6.1): + eslint@10.7.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.7.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.2 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.5 - '@eslint/js': 9.39.4 - '@eslint/plugin-kit': 0.4.1 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.6.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 ajv: 6.15.0 - chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -6597,21 +6495,26 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.5 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 2.6.1 + jiti: 2.7.0 transitivePeerDependencies: - supports-color espree@10.4.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 4.2.1 + espree@11.2.0: + dependencies: + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + eslint-visitor-keys: 5.0.1 + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -6624,7 +6527,7 @@ snapshots: estree-util-attach-comments@3.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-util-build-jsx@3.0.1: dependencies: @@ -6637,7 +6540,7 @@ snapshots: estree-util-scope@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 estree-util-to-js@2.0.0: @@ -6655,7 +6558,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esutils@2.0.3: {} @@ -6679,7 +6582,7 @@ snapshots: dependencies: pify: 2.3.0 - expect-type@1.3.0: {} + expect-type@1.4.0: {} extend@3.0.2: {} @@ -6693,9 +6596,9 @@ snapshots: fast-levenshtein@2.0.6: {} - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.5 fflate@0.8.3: {} @@ -6738,14 +6641,14 @@ snapshots: hasown: 2.0.4 mime-types: 2.1.35 - framer-motion@12.38.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + framer-motion@12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - motion-dom: 12.38.0 - motion-utils: 12.36.0 + motion-dom: 12.42.2 + motion-utils: 12.39.0 tslib: 2.8.1 optionalDependencies: - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) fs-extra@10.1.0: dependencies: @@ -6767,14 +6670,19 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.8: + function-timeout@1.0.2: {} + + function.prototype.name@1.2.0: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 - define-properties: 1.2.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 functions-have-names: 1.2.3 - hasown: 2.0.3 + has-property-descriptors: 1.0.2 + hasown: 2.0.4 is-callable: 1.2.7 + is-document.all: 1.0.0 functional-red-black-tree@1.0.1: {} @@ -6837,9 +6745,7 @@ snapshots: dependencies: ini: 2.0.0 - globals@14.0.0: {} - - globals@17.5.0: {} + globals@17.7.0: {} globalthis@1.0.4: dependencies: @@ -6848,7 +6754,7 @@ snapshots: globrex@0.1.2: {} - goober@2.1.18(csstype@3.2.3): + goober@2.1.19(csstype@3.2.3): dependencies: csstype: 3.2.3 @@ -6893,9 +6799,9 @@ snapshots: hast-util-to-estree@3.1.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 comma-separated-tokens: 2.0.3 devlop: 1.1.0 estree-util-attach-comments: 3.0.0 @@ -6904,7 +6810,7 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.1.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 style-to-js: 1.1.21 unist-util-position: 5.0.0 @@ -6914,8 +6820,8 @@ snapshots: hast-util-to-jsx-runtime@2.3.6: dependencies: - '@types/estree': 1.0.8 - '@types/hast': 3.0.4 + '@types/estree': 1.0.9 + '@types/hast': 3.0.5 '@types/unist': 3.0.3 comma-separated-tokens: 2.0.3 devlop: 1.1.0 @@ -6924,7 +6830,7 @@ snapshots: mdast-util-mdx-expression: 2.0.1 mdast-util-mdx-jsx: 3.2.0 mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.1.0 + property-information: 7.2.0 space-separated-tokens: 2.0.2 style-to-js: 1.1.21 unist-util-position: 5.0.0 @@ -6934,7 +6840,7 @@ snapshots: hast-util-whitespace@3.0.0: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 he@1.2.0: {} @@ -6946,37 +6852,27 @@ snapshots: html-encoding-sniffer@6.0.0: dependencies: - '@exodus/bytes': 1.15.0 + '@exodus/bytes': 1.15.1 transitivePeerDependencies: - '@noble/hashes' - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - http-signature@1.4.0: dependencies: assert-plus: 1.0.0 jsprim: 2.0.2 sshpk: 1.18.0 - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color - human-signals@1.1.1: {} + identifier-regex@1.1.0: + dependencies: + reserved-identifiers: 1.2.0 + ieee754@1.2.1: {} ignore@5.3.2: {} - ignore@7.0.5: {} + ignore@7.0.6: {} import-fresh@3.3.1: dependencies: @@ -6996,8 +6892,8 @@ snapshots: internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.3 - side-channel: 1.1.0 + hasown: 2.0.4 + side-channel: 1.1.1 is-alphabetical@2.0.1: {} @@ -7033,13 +6929,13 @@ snapshots: is-builtin-module@5.0.0: dependencies: - builtin-modules: 5.1.0 + builtin-modules: 5.3.0 is-callable@1.2.7: {} - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: - hasown: 2.0.3 + hasown: 2.0.4 is-data-view@1.0.2: dependencies: @@ -7054,6 +6950,10 @@ snapshots: is-decimal@2.0.1: {} + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -7080,6 +6980,11 @@ snapshots: is-hexadecimal@2.0.1: {} + is-identifier@1.1.0: + dependencies: + identifier-regex: 1.1.0 + super-regex: 1.1.0 + is-installed-globally@0.4.0: dependencies: global-dirs: 3.0.1 @@ -7107,7 +7012,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.3 + hasown: 2.0.4 is-set@2.0.3: {} @@ -7130,7 +7035,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.20 + which-typed-array: 1.1.22 is-typedarray@1.0.0: {} @@ -7149,7 +7054,7 @@ snapshots: isarray@2.0.5: {} - isbot@5.1.39: {} + isbot@5.2.1: {} isexe@2.0.0: {} @@ -7158,7 +7063,7 @@ snapshots: iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 get-proto: 1.0.1 has-symbols: 1.1.0 @@ -7170,7 +7075,7 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jiti@2.6.1: {} + jiti@2.7.0: {} js-tokens@4.0.0: {} @@ -7178,25 +7083,29 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@5.2.1: + dependencies: + argparse: 2.0.1 + jsbn@0.1.1: {} - jsdom@28.1.0: + jsdom@29.1.1: dependencies: - '@acemir/cssom': 0.9.31 - '@asamuzakjp/dom-selector': 6.8.1 + '@asamuzakjp/css-color': 5.1.11 + '@asamuzakjp/dom-selector': 7.1.1 '@bramus/specificity': 2.4.2 - '@exodus/bytes': 1.15.0 - cssstyle: 6.2.0 + '@csstools/css-syntax-patches-for-csstree': 1.1.6(css-tree@3.2.1) + '@exodus/bytes': 1.15.1 + css-tree: 3.2.1 data-urls: 7.0.0 decimal.js: 10.6.0 html-encoding-sniffer: 6.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 + lru-cache: 11.5.2 parse5: 8.0.1 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 6.0.1 + tough-cookie: 6.0.2 undici: 7.28.0 w3c-xmlserializer: 5.0.0 webidl-conversions: 8.0.1 @@ -7205,7 +7114,6 @@ snapshots: xml-name-validator: 5.0.0 transitivePeerDependencies: - '@noble/hashes' - - supports-color jsesc@3.1.0: {} @@ -7252,7 +7160,7 @@ snapshots: launch-editor@2.14.1: dependencies: picocolors: 1.1.1 - shell-quote: 1.9.0 + shell-quote: 1.10.0 levn@0.4.1: dependencies: @@ -7366,7 +7274,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.3.5: {} + lru-cache@11.5.2: {} lru-cache@5.1.1: dependencies: @@ -7378,6 +7286,12 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + make-asynchronous@1.1.0: + dependencies: + p-event: 6.0.1 + type-fest: 4.41.0 + web-worker: 1.5.0 + markdown-extensions@2.0.0: {} markdown-table@3.0.4: {} @@ -7470,7 +7384,7 @@ snapshots: mdast-util-mdx-expression@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.3 @@ -7481,7 +7395,7 @@ snapshots: mdast-util-mdx-jsx@3.2.0: dependencies: '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 '@types/unist': 3.0.3 ccount: 2.0.1 @@ -7508,7 +7422,7 @@ snapshots: mdast-util-mdxjs-esm@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 mdast-util-from-markdown: 2.0.3 @@ -7523,9 +7437,9 @@ snapshots: mdast-util-to-hast@13.2.1: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.0 + '@ungap/structured-clone': 1.3.3 devlop: 1.1.0 micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 @@ -7551,6 +7465,8 @@ snapshots: mdn-data@2.27.1: {} + mdn-data@2.28.1: {} + merge-stream@2.0.0: {} micromark-core-commonmark@2.0.3: @@ -7632,7 +7548,7 @@ snapshots: micromark-extension-mdx-expression@3.0.1: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 micromark-factory-mdx-expression: 2.0.3 micromark-factory-space: 2.0.1 @@ -7643,7 +7559,7 @@ snapshots: micromark-extension-mdx-jsx@3.0.2: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 micromark-factory-mdx-expression: 2.0.3 @@ -7660,7 +7576,7 @@ snapshots: micromark-extension-mdxjs-esm@3.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-util-character: 2.1.1 @@ -7672,8 +7588,8 @@ snapshots: micromark-extension-mdxjs@3.0.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) micromark-extension-mdx-expression: 3.0.1 micromark-extension-mdx-jsx: 3.0.2 micromark-extension-mdx-md: 2.0.0 @@ -7696,7 +7612,7 @@ snapshots: micromark-factory-mdx-expression@2.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 devlop: 1.1.0 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 @@ -7760,7 +7676,7 @@ snapshots: micromark-util-events-to-acorn@2.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 '@types/unist': 3.0.3 devlop: 1.1.0 estree-util-visit: 2.0.0 @@ -7835,7 +7751,7 @@ snapshots: minimatch@3.1.5: dependencies: - brace-expansion: 1.1.14 + brace-expansion: 1.1.16 minimatch@9.0.9: dependencies: @@ -7899,27 +7815,27 @@ snapshots: monaco-editor@0.55.1: dependencies: - dompurify: 3.4.11 + dompurify: 3.4.12 marked: 14.0.0 monaco-xsd-code-completion@1.1.1: dependencies: '@xmldom/xmldom': 0.8.13 - prettier: 3.8.3 + prettier: 3.9.5 ts-debounce: 4.0.0 turndown: 7.2.4 - motion-dom@12.38.0: + motion-dom@12.42.2: dependencies: - motion-utils: 12.36.0 + motion-utils: 12.39.0 - motion-utils@12.36.0: {} + motion-utils@12.39.0: {} mrmime@2.0.1: {} ms@2.1.3: {} - nanoid@3.3.15: {} + nanoid@3.3.16: {} natural-compare@1.4.0: {} @@ -7928,14 +7844,14 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 - node-exports-info@1.6.0: + node-exports-info@1.6.2: dependencies: array.prototype.flatmap: 1.3.3 es-errors: 1.3.0 object.entries: 1.1.9 semver: 6.3.1 - node-releases@2.0.38: {} + node-releases@2.0.51: {} npm-run-path@4.0.1: dependencies: @@ -7957,7 +7873,7 @@ snapshots: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 has-symbols: 1.1.0 object-keys: 1.1.1 @@ -7966,23 +7882,23 @@ snapshots: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 object.fromentries@2.0.8: dependencies: call-bind: 1.0.9 define-properties: 1.2.1 es-abstract: 1.24.2 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 object.values@1.2.1: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 - obug@2.1.1: {} + obug@2.1.4: {} once@1.4.0: dependencies: @@ -8015,6 +7931,10 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + p-event@6.0.1: + dependencies: + p-timeout: 6.1.4 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -8023,6 +7943,8 @@ snapshots: dependencies: p-limit: 3.1.0 + p-timeout@6.1.4: {} + package-json-from-dist@1.0.1: {} parent-module@1.0.1: @@ -8041,7 +7963,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -8073,7 +7995,7 @@ snapshots: picocolors@1.1.1: {} - picomatch@4.0.4: {} + picomatch@4.0.5: {} pify@2.3.0: {} @@ -8081,9 +8003,9 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss@8.5.16: + postcss@8.5.19: dependencies: - nanoid: 3.3.15 + nanoid: 3.3.16 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -8093,11 +8015,11 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-tailwindcss@0.6.14(prettier@3.8.3): + prettier-plugin-tailwindcss@0.8.1(prettier@3.9.5): dependencies: - prettier: 3.8.3 + prettier: 3.9.5 - prettier@3.8.3: {} + prettier@3.9.5: {} pretty-bytes@5.6.0: {} @@ -8121,7 +8043,7 @@ snapshots: retry: 0.12.0 signal-exit: 3.0.7 - property-information@7.1.0: {} + property-information@7.2.0: {} proxy-from-env@1.0.0: {} @@ -8137,13 +8059,15 @@ snapshots: es-define-property: 1.0.1 side-channel: 1.1.1 - react-complex-tree@2.6.1(react@19.2.5): + quote-js-string@0.1.0: {} + + react-complex-tree@2.6.2(react@19.2.7): dependencies: - react: 19.2.5 + react: 19.2.7 - react-d3-tree@3.6.6(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + react-d3-tree@3.6.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - '@bkrem/react-transition-group': 1.3.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@bkrem/react-transition-group': 1.3.5(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@types/d3-hierarchy': 1.1.11 clone: 2.1.2 d3-hierarchy: 1.1.9 @@ -8151,19 +8075,19 @@ snapshots: d3-shape: 1.3.7 d3-zoom: 3.0.0 dequal: 2.0.3 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) uuid: 14.0.1 - react-dom@19.2.5(react@19.2.5): + react-dom@19.2.7(react@19.2.7): dependencies: - react: 19.2.5 + react: 19.2.7 scheduler: 0.27.0 - react-hotkeys-hook@5.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + react-hotkeys-hook@5.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) react-is@16.13.1: {} @@ -8171,35 +8095,35 @@ snapshots: react-lifecycles-compat@3.0.4: {} - react-router-devtools@6.2.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(csstype@3.2.3)(react-dom@19.2.5(react@19.2.5))(react-router@8.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(react@19.2.5)(solid-js@1.9.12)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)): + react-router-devtools@6.2.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.2.7(react@19.2.7))(react-router@8.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(solid-js@1.9.12)(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0)): dependencies: '@babel/core': 7.29.7 - '@babel/generator': 7.29.1 - '@babel/parser': 7.29.2 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@babel/generator': 7.29.7 + '@babel/parser': 7.29.7 + '@babel/traverse': 7.29.7 + '@babel/types': 7.29.7 + '@radix-ui/react-accordion': 1.2.16(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) '@tanstack/devtools-client': 0.0.5 - '@tanstack/devtools-event-client': 0.4.3 - '@tanstack/devtools-vite': 0.4.1(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) - '@tanstack/react-devtools': 0.9.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(csstype@3.2.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(solid-js@1.9.12) - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) + '@tanstack/devtools-event-client': 0.4.4 + '@tanstack/devtools-vite': 0.4.1(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0)) + '@tanstack/react-devtools': 0.9.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(csstype@3.2.3)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(solid-js@1.9.12) + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) chalk: 5.6.2 clsx: 2.1.1 - framer-motion: 12.38.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - goober: 2.1.18(csstype@3.2.3) - react: 19.2.5 - react-d3-tree: 3.6.6(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - react-dom: 19.2.5(react@19.2.5) - react-hotkeys-hook: 5.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - react-router: 8.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - react-tooltip: 5.30.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + framer-motion: 12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + goober: 2.1.19(csstype@3.2.3) + react: 19.2.7 + react-d3-tree: 3.6.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react-dom: 19.2.7(react@19.2.7) + react-hotkeys-hook: 5.3.3(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react-router: 8.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react-tooltip: 5.30.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + vite: 8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0) optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.4.13 - '@rollup/rollup-darwin-arm64': 4.60.2 - '@rollup/rollup-linux-x64-gnu': 4.60.2 + '@biomejs/cli-darwin-arm64': 2.5.4 + '@rollup/rollup-darwin-arm64': 4.62.2 + '@rollup/rollup-linux-x64-gnu': 4.62.2 transitivePeerDependencies: - '@emotion/is-prop-valid' - bufferutil @@ -8208,21 +8132,21 @@ snapshots: - supports-color - utf-8-validate - react-router@8.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + react-router@8.2.0(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: cookie-es: 3.1.1 - react: 19.2.5 + react: 19.2.7 optionalDependencies: - react-dom: 19.2.5(react@19.2.5) + react-dom: 19.2.7(react@19.2.7) - react-tooltip@5.30.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5): + react-tooltip@5.30.1(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: - '@floating-ui/dom': 1.7.6 + '@floating-ui/dom': 1.8.0 classnames: 2.5.1 - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) - react@19.2.5: {} + react@19.2.7: {} readdirp@4.1.2: {} @@ -8230,14 +8154,14 @@ snapshots: recma-build-jsx@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-util-build-jsx: 3.0.1 vfile: 6.0.3 - recma-jsx@1.0.1(acorn@8.16.0): + recma-jsx@1.0.1(acorn@8.17.0): dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) estree-util-to-js: 2.0.0 recma-parse: 1.0.0 recma-stringify: 1.0.0 @@ -8245,14 +8169,14 @@ snapshots: recma-parse@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esast-util-from-js: 2.0.1 unified: 11.0.5 vfile: 6.0.3 recma-stringify@1.0.0: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-util-to-js: 2.0.0 unified: 11.0.5 vfile: 6.0.3 @@ -8272,7 +8196,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.2 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -8284,8 +8208,6 @@ snapshots: regexp-to-ast@0.5.0: {} - regexp-tree@0.1.27: {} - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.9 @@ -8295,14 +8217,14 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - regjsparser@0.13.1: + regjsparser@0.13.2: dependencies: jsesc: 3.1.0 rehype-recma@1.0.0: dependencies: - '@types/estree': 1.0.8 - '@types/hast': 3.0.4 + '@types/estree': 1.0.9 + '@types/hast': 3.0.5 hast-util-to-estree: 3.1.3 transitivePeerDependencies: - supports-color @@ -8336,7 +8258,7 @@ snapshots: remark-rehype@11.1.2: dependencies: - '@types/hast': 3.0.4 + '@types/hast': 3.0.5 '@types/mdast': 4.0.4 mdast-util-to-hast: 13.2.1 unified: 11.0.5 @@ -8356,13 +8278,15 @@ snapshots: require-from-string@2.0.2: {} + reserved-identifiers@1.2.0: {} + resolve-from@4.0.0: {} - resolve@2.0.0-next.6: + resolve@2.0.0-next.7: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.1 - node-exports-info: 1.6.0 + is-core-module: 2.16.2 + node-exports-info: 1.6.2 object-keys: 1.1.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -8376,26 +8300,26 @@ snapshots: rfdc@1.4.1: {} - rolldown@1.1.3: + rolldown@1.1.5: dependencies: - '@oxc-project/types': 0.137.0 + '@oxc-project/types': 0.139.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.1.3 - '@rolldown/binding-darwin-arm64': 1.1.3 - '@rolldown/binding-darwin-x64': 1.1.3 - '@rolldown/binding-freebsd-x64': 1.1.3 - '@rolldown/binding-linux-arm-gnueabihf': 1.1.3 - '@rolldown/binding-linux-arm64-gnu': 1.1.3 - '@rolldown/binding-linux-arm64-musl': 1.1.3 - '@rolldown/binding-linux-ppc64-gnu': 1.1.3 - '@rolldown/binding-linux-s390x-gnu': 1.1.3 - '@rolldown/binding-linux-x64-gnu': 1.1.3 - '@rolldown/binding-linux-x64-musl': 1.1.3 - '@rolldown/binding-openharmony-arm64': 1.1.3 - '@rolldown/binding-wasm32-wasi': 1.1.3 - '@rolldown/binding-win32-arm64-msvc': 1.1.3 - '@rolldown/binding-win32-x64-msvc': 1.1.3 + '@rolldown/binding-android-arm64': 1.1.5 + '@rolldown/binding-darwin-arm64': 1.1.5 + '@rolldown/binding-darwin-x64': 1.1.5 + '@rolldown/binding-freebsd-x64': 1.1.5 + '@rolldown/binding-linux-arm-gnueabihf': 1.1.5 + '@rolldown/binding-linux-arm64-gnu': 1.1.5 + '@rolldown/binding-linux-arm64-musl': 1.1.5 + '@rolldown/binding-linux-ppc64-gnu': 1.1.5 + '@rolldown/binding-linux-s390x-gnu': 1.1.5 + '@rolldown/binding-linux-x64-gnu': 1.1.5 + '@rolldown/binding-linux-x64-musl': 1.1.5 + '@rolldown/binding-openharmony-arm64': 1.1.5 + '@rolldown/binding-wasm32-wasi': 1.1.5 + '@rolldown/binding-win32-arm64-msvc': 1.1.5 + '@rolldown/binding-win32-x64-msvc': 1.1.5 rollup@4.60.2: dependencies: @@ -8469,13 +8393,15 @@ snapshots: semver@7.7.4: {} + semver@7.8.5: {} + serialize-javascript@7.0.6: {} - seroval-plugins@1.5.2(seroval@1.5.2): + seroval-plugins@1.5.5(seroval@1.5.5): dependencies: - seroval: 1.5.2 + seroval: 1.5.5 - seroval@1.5.2: {} + seroval@1.5.5: {} set-function-length@1.2.2: dependencies: @@ -8497,7 +8423,7 @@ snapshots: dependencies: dunder-proto: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 shebang-command@2.0.0: dependencies: @@ -8505,7 +8431,7 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.9.0: {} + shell-quote@1.10.0: {} side-channel-list@1.0.1: dependencies: @@ -8527,14 +8453,6 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.1 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - side-channel@1.1.1: dependencies: es-errors: 1.3.0 @@ -8573,8 +8491,8 @@ snapshots: solid-js@1.9.12: dependencies: csstype: 3.2.3 - seroval: 1.5.2 - seroval-plugins: 1.5.2(seroval@1.5.2) + seroval: 1.5.5 + seroval-plugins: 1.5.5(seroval@1.5.5) source-map-js@1.2.1: {} @@ -8596,7 +8514,7 @@ snapshots: stackback@0.0.2: {} - std-env@4.1.0: {} + std-env@4.2.0: {} stop-iteration-iterator@1.1.0: dependencies: @@ -8633,42 +8551,43 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.2 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 regexp.prototype.flags: 1.5.4 set-function-name: 2.0.2 - side-channel: 1.1.0 + side-channel: 1.1.1 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 es-abstract: 1.24.2 - string.prototype.trim@1.2.10: + string.prototype.trim@1.2.11: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 es-abstract: 1.24.2 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 - string.prototype.trimend@1.0.9: + string.prototype.trimend@1.0.10: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.9 define-properties: 1.2.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 stringify-entities@4.0.4: dependencies: @@ -8701,6 +8620,12 @@ snapshots: dependencies: inline-style-parser: 0.2.7 + super-regex@1.1.0: + dependencies: + function-timeout: 1.0.2 + make-asynchronous: 1.1.0 + time-span: 5.1.0 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -8715,15 +8640,15 @@ snapshots: symbol-tree@3.2.4: {} - synckit@0.11.12: + synckit@0.11.13: dependencies: - '@pkgr/core': 0.2.9 + '@pkgr/core': 0.3.6 systeminformation@5.31.11: {} - tailwind-merge@3.5.0: {} + tailwind-merge@3.6.0: {} - tailwindcss@4.2.4: {} + tailwindcss@4.3.3: {} tapable@2.3.3: {} @@ -8735,35 +8660,34 @@ snapshots: throttleit@1.0.1: {} + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 + tiny-invariant@1.3.3: {} tinybench@2.9.0: {} - tinyexec@1.1.1: {} - - tinyglobby@0.2.16: - dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + tinyexec@1.2.4: {} tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tinyrainbow@3.1.0: {} tldts-core@6.1.86: {} - tldts-core@7.0.28: {} + tldts-core@7.4.9: {} tldts@6.1.86: dependencies: tldts-core: 6.1.86 - tldts@7.0.28: + tldts@7.4.9: dependencies: - tldts-core: 7.0.28 + tldts-core: 7.4.9 tmp@0.2.7: {} @@ -8773,9 +8697,9 @@ snapshots: dependencies: tldts: 6.1.86 - tough-cookie@6.0.1: + tough-cookie@6.0.2: dependencies: - tldts: 7.0.28 + tldts: 7.4.9 tr46@6.0.0: dependencies: @@ -8817,6 +8741,8 @@ snapshots: type-fest@0.8.1: {} + type-fest@4.41.0: {} + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -8841,7 +8767,7 @@ snapshots: is-typed-array: 1.1.15 reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.7: + typed-array-length@1.0.8: dependencies: call-bind: 1.0.9 for-each: 0.3.5 @@ -8850,13 +8776,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.64.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.59.0(@typescript-eslint/parser@8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.59.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.59.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.4(jiti@2.6.1) + '@typescript-eslint/eslint-plugin': 8.64.0(@typescript-eslint/parser@8.64.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3))(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.64.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.64.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.64.0(eslint@10.7.0(jiti@2.7.0))(typescript@5.9.3) + eslint: 10.7.0(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -8917,9 +8843,9 @@ snapshots: untildify@4.0.0: {} - update-browserslist-db@1.2.3(browserslist@4.28.2): + update-browserslist-db@1.2.3(browserslist@4.28.6): dependencies: - browserslist: 4.28.2 + browserslist: 4.28.6 escalade: 3.2.0 picocolors: 1.1.1 @@ -8927,14 +8853,14 @@ snapshots: dependencies: punycode: 2.3.1 - use-sync-external-store@1.6.0(react@19.2.5): + use-sync-external-store@1.6.0(react@19.2.7): dependencies: - react: 19.2.5 + react: 19.2.7 - usehooks-ts@3.1.1(react@19.2.5): + usehooks-ts@3.1.1(react@19.2.7): dependencies: lodash.debounce: 4.0.8 - react: 19.2.5 + react: 19.2.7 uuid@14.0.1: {} @@ -8954,81 +8880,82 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-plugin-checker@0.14.1(eslint@9.39.4(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)): + vite-plugin-checker@0.14.4(eslint@10.7.0(jiti@2.7.0))(optionator@0.9.4)(typescript@5.9.3)(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0)): dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 chokidar: 5.0.0 npm-run-path: 6.0.0 picocolors: 1.1.1 - picomatch: 4.0.4 + picomatch: 4.0.5 proper-lockfile: 4.1.2 tiny-invariant: 1.3.3 - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + vite: 8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0) optionalDependencies: - eslint: 9.39.4(jiti@2.6.1) + eslint: 10.7.0(jiti@2.7.0) optionator: 0.9.4 typescript: 5.9.3 - vite-plugin-svgr@5.2.0(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)): + vite-plugin-svgr@5.2.0(rollup@4.60.2)(typescript@5.9.3)(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0)): dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.60.2) + '@rollup/pluginutils': 5.4.0(rollup@4.60.2) '@svgr/core': 8.1.0(typescript@5.9.3) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.9.3)) - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + vite: 8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0) transitivePeerDependencies: - rollup - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0)): dependencies: debug: 4.4.3(supports-color@8.1.1) globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + vite: 8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color - typescript - vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1): + vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 - picomatch: 4.0.4 - postcss: 8.5.16 - rolldown: 1.1.3 + picomatch: 4.0.5 + postcss: 8.5.19 + rolldown: 1.1.5 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.43 fsevents: 2.3.3 - jiti: 2.6.1 - - vitest@4.1.5(@types/node@20.19.39)(@vitest/ui@4.1.5)(jsdom@28.1.0)(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)): - dependencies: - '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(vite@8.1.0(@types/node@20.19.39)(jiti@2.6.1)) - '@vitest/pretty-format': 4.1.5 - '@vitest/runner': 4.1.5 - '@vitest/snapshot': 4.1.5 - '@vitest/spy': 4.1.5 - '@vitest/utils': 4.1.5 - es-module-lexer: 2.0.0 - expect-type: 1.3.0 + jiti: 2.7.0 + yaml: 2.9.0 + + vitest@4.1.10(@types/node@20.19.43)(@vitest/ui@4.1.10)(jsdom@29.1.1)(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0)): + dependencies: + '@vitest/expect': 4.1.10 + '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.10 + '@vitest/runner': 4.1.10 + '@vitest/snapshot': 4.1.10 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 + es-module-lexer: 2.3.1 + expect-type: 1.4.0 magic-string: 0.30.21 - obug: 2.1.1 + obug: 2.1.4 pathe: 2.0.3 - picomatch: 4.0.4 - std-env: 4.1.0 + picomatch: 4.0.5 + std-env: 4.2.0 tinybench: 2.9.0 - tinyexec: 1.1.1 - tinyglobby: 0.2.16 + tinyexec: 1.2.4 + tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.1.0(@types/node@20.19.39)(jiti@2.6.1) + vite: 8.1.5(@types/node@20.19.43)(jiti@2.7.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.19.39 - '@vitest/ui': 4.1.5(vitest@4.1.5) - jsdom: 28.1.0 + '@types/node': 20.19.43 + '@vitest/ui': 4.1.10(vitest@4.1.10) + jsdom: 29.1.1 transitivePeerDependencies: - msw @@ -9040,13 +8967,15 @@ snapshots: dependencies: loose-envify: 1.4.0 + web-worker@1.5.0: {} + webidl-conversions@8.0.1: {} whatwg-mimetype@5.0.0: {} whatwg-url@16.0.1: dependencies: - '@exodus/bytes': 1.15.0 + '@exodus/bytes': 1.15.1 tr46: 6.0.0 webidl-conversions: 8.0.1 transitivePeerDependencies: @@ -9063,7 +8992,7 @@ snapshots: which-builtin-type@1.2.1: dependencies: call-bound: 1.0.4 - function.prototype.name: 1.1.8 + function.prototype.name: 1.2.0 has-tostringtag: 1.0.2 is-async-function: 2.1.1 is-date-object: 1.1.0 @@ -9074,7 +9003,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.20 + which-typed-array: 1.1.22 which-collection@1.0.2: dependencies: @@ -9083,7 +9012,7 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-typed-array@1.1.20: + which-typed-array@1.1.22: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.9 @@ -9126,20 +9055,22 @@ snapshots: wrappy@1.0.2: {} - ws@8.21.0: {} + ws@8.21.1: {} xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} - xmllint-wasm@5.2.0(@types/node@20.19.39): + xmllint-wasm@5.2.0(@types/node@20.19.43): dependencies: - '@types/node': 20.19.39 + '@types/node': 20.19.43 y18n@5.0.8: {} yallist@3.1.1: {} + yaml@2.9.0: {} + yargs-parser@21.1.1: {} yargs-unparser@2.0.0: @@ -9165,23 +9096,23 @@ snapshots: yocto-queue@0.1.0: {} - zod-validation-error@4.0.2(zod@4.3.6): + zod-validation-error@4.0.2(zod@4.4.3): dependencies: - zod: 4.3.6 + zod: 4.4.3 - zod@4.3.6: {} + zod@4.4.3: {} - zustand@4.5.7(@types/react@19.2.14)(react@19.2.5): + zustand@4.5.7(@types/react@19.2.17)(react@19.2.7): dependencies: - use-sync-external-store: 1.6.0(react@19.2.5) + use-sync-external-store: 1.6.0(react@19.2.7) optionalDependencies: - '@types/react': 19.2.14 - react: 19.2.5 + '@types/react': 19.2.17 + react: 19.2.7 - zustand@5.0.12(@types/react@19.2.14)(react@19.2.5)(use-sync-external-store@1.6.0(react@19.2.5)): + zustand@5.0.14(@types/react@19.2.17)(react@19.2.7)(use-sync-external-store@1.6.0(react@19.2.7)): optionalDependencies: - '@types/react': 19.2.14 - react: 19.2.5 - use-sync-external-store: 1.6.0(react@19.2.5) + '@types/react': 19.2.17 + react: 19.2.7 + use-sync-external-store: 1.6.0(react@19.2.7) zwitch@2.0.4: {} diff --git a/src/main/frontend/eslint.config.mjs b/src/main/frontend/eslint.config.mjs index e66f9f5f..467d94f9 100644 --- a/src/main/frontend/eslint.config.mjs +++ b/src/main/frontend/eslint.config.mjs @@ -1,23 +1,53 @@ -import typescriptParser from '@typescript-eslint/parser'; -import tsPlugin from '@typescript-eslint/eslint-plugin'; -import reactPlugin from 'eslint-plugin-react'; -import reactHooksPlugin from 'eslint-plugin-react-hooks'; -import prettierPlugin from 'eslint-plugin-prettier'; -import unicorn from 'eslint-plugin-unicorn'; -import sonarjs from 'eslint-plugin-sonarjs'; -import stylistic from '@stylistic/eslint-plugin'; -import js from '@eslint/js'; -import eslintConfigPrettier from 'eslint-config-prettier'; - -export default [ +// @ts-check +import eslint from '@eslint/js' +import { defineConfig } from 'eslint/config' +import tseslint from 'typescript-eslint' +import prettierPlugin from 'eslint-plugin-prettier' +import eslintConfigPrettier from 'eslint-config-prettier' +import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended' +import eslintPluginUnicorn from 'eslint-plugin-unicorn' +import typescriptParser from '@typescript-eslint/parser' +import reactPlugin from 'eslint-plugin-react' +import reactHooksPlugin from 'eslint-plugin-react-hooks' +import sonarjs from 'eslint-plugin-sonarjs' +import stylistic from '@stylistic/eslint-plugin' + +export default defineConfig([ { ignores: ['.cache/', '.git/', '.github/', 'node_modules/', 'dist/', 'build/', '.react-router/'], }, + eslintPluginUnicorn.configs.recommended, { - ...js.configs.recommended, + rules: { + 'unicorn/prevent-abbreviations': 'warn', + 'unicorn/no-array-reduce': 'off', + 'unicorn/prefer-ternary': 'warn', + 'unicorn/no-null': 'off', + 'unicorn/prefer-dom-node-text-content': 'warn', + 'unicorn/consistent-function-scoping': [ + 'error', + { + checkArrowFunctions: false, + }, + ], + 'unicorn/consistent-class-member-order': 'off', // handled by @typescript-eslint/member-ordering + 'unicorn/prefer-object-iterable-methods': 'off', + 'unicorn/name-replacements': [ + 'warn', + { + replacements: { configuration: false }, + }, + ], + 'unicorn/prefer-await': 'off', // preferably only if the function works better as async + 'unicorn/consistent-boolean-name': 'off', + 'unicorn/no-empty-file': 'warn', + 'unicorn/filename-case': 'off', + }, }, + eslintPluginPrettierRecommended, + { files: ['**/*.ts', '**/*.tsx'], languageOptions: { @@ -30,12 +60,12 @@ export default [ }, }, }, + extends: [tseslint.configs.recommended, tseslint.configs.stylistic], plugins: { - '@typescript-eslint': tsPlugin, - 'react': reactPlugin, + react: reactPlugin, 'react-hooks': reactHooksPlugin, - 'prettier': prettierPlugin, - 'sonarjs': sonarjs, + prettier: prettierPlugin, + sonarjs: sonarjs, '@stylistic': stylistic, }, settings: { @@ -44,27 +74,185 @@ export default [ }, }, rules: { - ...tsPlugin.configs.recommended?.rules, - ...tsPlugin.configs.stylistic?.rules, - ...reactPlugin.configs.recommended?.rules, - ...reactPlugin.configs['jsx-runtime']?.rules, - ...eslintConfigPrettier?.rules, + '@typescript-eslint/explicit-function-return-type': 'error', + '@typescript-eslint/triple-slash-reference': 'warn', + '@typescript-eslint/member-ordering': [ + 'error', + { + default: { + memberTypes: [ + // Index signature + 'signature', + 'call-signature', + + // Fields + 'public-static-field', + 'protected-static-field', + 'private-static-field', + '#private-static-field', + + 'public-decorated-field', + 'protected-decorated-field', + 'private-decorated-field', + + 'public-instance-field', + 'protected-instance-field', + 'private-instance-field', + 'private-instance-readonly-field', + '#private-instance-field', + '#private-instance-readonly-field', + + 'public-abstract-field', + 'protected-abstract-field', + + 'public-field', + 'protected-field', + 'private-field', + '#private-field', + + 'static-field', + 'instance-field', + 'abstract-field', + + 'decorated-field', + + 'field', + + // Static initialization + 'static-initialization', + + // Constructors + 'public-constructor', + 'protected-constructor', + 'private-constructor', + + 'constructor', + + // Accessors + 'public-static-accessor', + 'protected-static-accessor', + 'private-static-accessor', + '#private-static-accessor', + + 'public-decorated-accessor', + 'protected-decorated-accessor', + 'private-decorated-accessor', + + 'public-instance-accessor', + 'protected-instance-accessor', + 'private-instance-accessor', + '#private-instance-accessor', + + 'public-abstract-accessor', + 'protected-abstract-accessor', + + 'public-accessor', + 'protected-accessor', + 'private-accessor', + '#private-accessor', + + 'static-accessor', + 'instance-accessor', + 'abstract-accessor', + + 'decorated-accessor', + + 'accessor', + + // Getters and Setters (merged) + ['public-static-get', 'public-static-set'], + ['protected-static-get', 'protected-static-set'], + ['private-static-get', 'private-static-set'], + ['#private-static-get', '#private-static-set'], + + ['public-decorated-get', 'public-decorated-set', 'public-instance-get', 'public-instance-set'], + [ + 'protected-decorated-get', + 'protected-decorated-set', + 'protected-instance-get', + 'protected-instance-set', + ], + ['private-decorated-get', 'private-decorated-set', 'private-instance-get', 'private-instance-set'], + ['#private-instance-get', '#private-instance-set'], - // TypeScript rules + ['public-abstract-get', 'public-abstract-set'], + ['protected-abstract-get', 'protected-abstract-set'], + + ['public-get', 'public-set'], + ['protected-get', 'protected-set'], + ['private-get', 'private-set'], + ['#private-get', '#private-set'], + + ['static-get', 'static-set'], + ['instance-get', 'instance-set'], + ['abstract-get', 'abstract-set'], + + ['decorated-get', 'decorated-set'], + + ['get', 'set'], + + // Methods + 'public-static-method', + 'protected-static-method', + 'private-static-method', + '#private-static-method', + + 'public-decorated-method', + 'protected-decorated-method', + 'private-decorated-method', + + 'public-instance-method', + 'protected-instance-method', + 'private-instance-method', + '#private-instance-method', + + 'public-abstract-method', + 'protected-abstract-method', + + 'public-method', + 'protected-method', + 'private-method', + '#private-method', + + 'static-method', + 'instance-method', + 'abstract-method', + + 'decorated-method', + + 'method', + ], + }, + }, + ], '@typescript-eslint/consistent-type-definitions': ['error', 'type'], - '@typescript-eslint/explicit-function-return-type': 'off', - '@typescript-eslint/no-unused-vars': ['warn', { varsIgnorePattern: '^_', argsIgnorePattern: '^_' }], - '@typescript-eslint/triple-slash-reference': 'warn', + '@typescript-eslint/no-unused-vars': [ + 'error', + { + args: 'all', + argsIgnorePattern: '^_', + caughtErrors: 'all', + caughtErrorsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + varsIgnorePattern: '^_', + ignoreRestSiblings: true, + }, + ], + + ...eslint.configs.recommended.rules, + 'prefer-template': 'error', + 'no-undef': 'off', + 'no-unused-vars': 'off', // Handled by @typescript-eslint/no-unused-vars // React rules + // ...reactPlugin.configs.recommended.rules, + // ...reactPlugin.configs['jsx-runtime'].rules, 'react/react-in-jsx-scope': 'off', 'react/prop-types': 'off', 'react-hooks/rules-of-hooks': 'error', 'react-hooks/exhaustive-deps': 'warn', - 'prefer-template': 'error', - 'no-undef': 'off', - + ...eslintConfigPrettier.rules, 'prettier/prettier': 'warn', '@stylistic/multiline-comment-style': ['error', 'starred-block'], @@ -73,20 +261,4 @@ export default [ 'sonarjs/no-duplicate-string': 'warn', }, }, - - { - plugins: { - unicorn, - }, - rules: { - ...unicorn.configs.recommended?.rules, - 'unicorn/no-empty-file': 'warn', - 'unicorn/prevent-abbreviations': 'off', - 'unicorn/no-array-reduce': 'off', - 'unicorn/prefer-ternary': 'warn', - 'unicorn/no-null': 'off', - 'unicorn/prefer-dom-node-text-content': 'warn', - 'unicorn/filename-case': 'off', - }, - }, -]; +]) diff --git a/src/main/frontend/eslint.config.old.mjs b/src/main/frontend/eslint.config.old.mjs new file mode 100644 index 00000000..e66f9f5f --- /dev/null +++ b/src/main/frontend/eslint.config.old.mjs @@ -0,0 +1,92 @@ +import typescriptParser from '@typescript-eslint/parser'; +import tsPlugin from '@typescript-eslint/eslint-plugin'; +import reactPlugin from 'eslint-plugin-react'; +import reactHooksPlugin from 'eslint-plugin-react-hooks'; +import prettierPlugin from 'eslint-plugin-prettier'; +import unicorn from 'eslint-plugin-unicorn'; +import sonarjs from 'eslint-plugin-sonarjs'; +import stylistic from '@stylistic/eslint-plugin'; +import js from '@eslint/js'; +import eslintConfigPrettier from 'eslint-config-prettier'; + +export default [ + { + ignores: ['.cache/', '.git/', '.github/', 'node_modules/', 'dist/', 'build/', '.react-router/'], + }, + + { + ...js.configs.recommended, + }, + + { + files: ['**/*.ts', '**/*.tsx'], + languageOptions: { + parser: typescriptParser, + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + ecmaFeatures: { + jsx: true, + }, + }, + }, + plugins: { + '@typescript-eslint': tsPlugin, + 'react': reactPlugin, + 'react-hooks': reactHooksPlugin, + 'prettier': prettierPlugin, + 'sonarjs': sonarjs, + '@stylistic': stylistic, + }, + settings: { + react: { + version: 'detect', + }, + }, + rules: { + ...tsPlugin.configs.recommended?.rules, + ...tsPlugin.configs.stylistic?.rules, + ...reactPlugin.configs.recommended?.rules, + ...reactPlugin.configs['jsx-runtime']?.rules, + ...eslintConfigPrettier?.rules, + + // TypeScript rules + '@typescript-eslint/consistent-type-definitions': ['error', 'type'], + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/no-unused-vars': ['warn', { varsIgnorePattern: '^_', argsIgnorePattern: '^_' }], + '@typescript-eslint/triple-slash-reference': 'warn', + + // React rules + 'react/react-in-jsx-scope': 'off', + 'react/prop-types': 'off', + 'react-hooks/rules-of-hooks': 'error', + 'react-hooks/exhaustive-deps': 'warn', + + 'prefer-template': 'error', + 'no-undef': 'off', + + 'prettier/prettier': 'warn', + + '@stylistic/multiline-comment-style': ['error', 'starred-block'], + + 'sonarjs/cognitive-complexity': 'warn', + 'sonarjs/no-duplicate-string': 'warn', + }, + }, + + { + plugins: { + unicorn, + }, + rules: { + ...unicorn.configs.recommended?.rules, + 'unicorn/no-empty-file': 'warn', + 'unicorn/prevent-abbreviations': 'off', + 'unicorn/no-array-reduce': 'off', + 'unicorn/prefer-ternary': 'warn', + 'unicorn/no-null': 'off', + 'unicorn/prefer-dom-node-text-content': 'warn', + 'unicorn/filename-case': 'off', + }, + }, +]; diff --git a/src/main/frontend/package.json b/src/main/frontend/package.json index 59f7b853..a2fbfd73 100644 --- a/src/main/frontend/package.json +++ b/src/main/frontend/package.json @@ -7,7 +7,7 @@ "start": "vite", "preview": "vite preview", "typecheck": "tsc --noEmit", - "lint": "eslint .", + "lint": "eslint ./app", "lint:fix": "eslint . --fix", "test": "vitest", "test:run": "vitest run", @@ -24,7 +24,7 @@ "dagre": "^0.8.5", "dotenv": "^17.4.2", "fflate": "^0.8.3", - "isbot": "^5.1.39", + "isbot": "^5.2.1", "monaco-editor": "0.55.1", "monaco-xsd-code-completion": "^1.1.1", "react": "^19.2.5", @@ -38,11 +38,11 @@ "zustand": "^5.0.12" }, "devDependencies": { - "@eslint/js": "^9.39.4", + "@eslint/js": "^10.0.1", "@mdx-js/react": "^3.1.1", "@prettier/plugin-xml": "^3.4.2", "@stylistic/eslint-plugin": "^5.10.0", - "@tailwindcss/vite": "^4.2.4", + "@tailwindcss/vite": "^4.3.3", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", @@ -50,26 +50,26 @@ "@types/node": "^20.19.39", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", - "@typescript-eslint/eslint-plugin": "^8.62.0", - "@typescript-eslint/parser": "^8.59.0", + "@typescript-eslint/eslint-plugin": "^8.64.0", + "@typescript-eslint/parser": "^8.64.0", "@vitejs/plugin-react": "^6.0.2", "@vitest/ui": "^4.1.5", - "eslint": "^9.39.4", + "eslint": "^10.7.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.5", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-sonarjs": "^4.0.3", - "eslint-plugin-unicorn": "^64.0.0", - "jsdom": "^28.0.3", - "prettier": "^3.8.3", - "prettier-plugin-tailwindcss": "^0.6.14", + "eslint-plugin-sonarjs": "^4.2.0", + "eslint-plugin-unicorn": "^72.0.0", + "jsdom": "^29.1.1", + "prettier": "^3.9.5", + "prettier-plugin-tailwindcss": "^0.8.1", "react-router-devtools": "^6.2.1", - "tailwindcss": "^4.2.4", + "tailwindcss": "^4.3.3", "typescript": "^5.9.3", - "typescript-eslint": "^8.59.0", - "vite": "^8.0.16", - "vite-plugin-checker": "^0.14.1", + "typescript-eslint": "^8.64.0", + "vite": "^8.1.5", + "vite-plugin-checker": "^0.14.4", "vite-plugin-svgr": "^5.2.0", "vite-tsconfig-paths": "^5.1.4", "vitest": "^4.1.5" From 9a93ab3b94b1df7727e2b230994b3045efe691a3 Mon Sep 17 00:00:00 2001 From: Vivy <4380412+Matthbo@users.noreply.github.com> Date: Fri, 17 Jul 2026 15:36:12 +0200 Subject: [PATCH 2/6] Autofix eslint errors --- .../datamapper/forms/add-conditions-form.tsx | 2 +- .../datamapper/forms/add-mapping-form.tsx | 6 +- .../datamapper/react-flow/node-types.tsx | 30 +-- .../base-files-data-provider.ts | 8 +- .../file-structure/confirm-delete-dialog.tsx | 10 +- .../file-structure/context-menu.tsx | 10 +- .../file-structure/editor-file-structure.tsx | 14 +- .../file-structure/file-tree-dialogs.tsx | 4 +- .../file-structure/inline-rename-input.tsx | 4 +- .../file-structure/name-input-dialog.tsx | 18 +- .../file-structure/studio-context-menu.tsx | 10 +- .../file-structure/studio-file-structure.tsx | 33 ++-- .../studio-file-tree-dialogs.tsx | 4 +- .../studio-files-data-provider.ts | 12 +- .../file-structure/tree-utilities.ts | 8 +- .../use-file-tree-context-menu.ts | 21 ++- .../file-structure/use-studio-context-menu.ts | 8 +- .../flow/add-subcomponent-modal.tsx | 8 +- .../components/flow/canvas-context-menu.tsx | 10 +- .../app/components/flow/create-node-modal.tsx | 2 +- .../app/components/git/diff-tab-view.tsx | 63 ++++--- .../app/components/git/git-changes.tsx | 4 +- .../app/components/git/git-commit-box.tsx | 12 +- .../frontend/app/components/git/git-panel.tsx | 4 +- .../app/components/git/git-toolbar.tsx | 4 +- .../components/inputs/active-icon-button.tsx | 4 +- .../app/components/inputs/checkbox.tsx | 18 +- .../app/components/inputs/close-button.tsx | 4 +- .../app/components/inputs/dropdown.tsx | 6 +- .../app/components/inputs/icon-button.tsx | 4 +- .../components/inputs/icon-label-button.tsx | 4 +- .../app/components/inputs/kebab-menu.tsx | 14 +- .../app/components/inputs/radio-button.tsx | 10 +- .../frontend/app/components/inputs/toggle.tsx | 10 +- .../components/inputs/tree-action-button.tsx | 4 +- .../sidebars-layout/sidebar-header.tsx | 2 +- .../sidebars-layout/sidebar-layout.tsx | 8 +- .../frontend/app/components/tabs/tabs.tsx | 4 +- src/main/frontend/app/hooks/use-async.ts | 34 ++-- .../app/hooks/use-context-menu-dismiss.ts | 6 +- .../hooks/use-datamapper-flow-management.ts | 36 ++-- .../frontend/app/hooks/use-file-watcher.ts | 6 +- .../app/hooks/use-shortcut-listener.ts | 22 +-- src/main/frontend/app/hooks/use-shortcut.ts | 8 +- .../frontend/app/hooks/use-submit-on-enter.ts | 6 +- .../providers/frankconfig-xsd-provider.tsx | 4 +- .../configuration-file-tile.tsx | 2 +- .../configurations/configuration-overview.tsx | 14 +- .../app/routes/datamapper/property-list.tsx | 11 +- .../frontend/app/routes/datamapper/root.tsx | 24 +-- .../frontend/app/routes/editor/editor.tsx | 174 +++++++++--------- .../frontend/app/routes/editor/xml-utils.ts | 34 ++-- .../frontend/app/routes/help/help-image.tsx | 4 +- src/main/frontend/app/routes/help/help.tsx | 4 +- .../app/routes/help/keybinds-table.tsx | 12 +- .../routes/projectlanding/project-landing.tsx | 11 +- .../app/routes/studio/canvas/nodes.ts | 2 +- .../nodetypes/components/handle-menu.tsx | 16 +- .../components/missing-requirements.tsx | 10 +- .../studio/canvas/nodetypes/frank-node.tsx | 38 ++-- .../studio/canvas/nodetypes/sticky-note.tsx | 14 +- .../routes/studio/context/context-input.tsx | 24 ++- .../studio/context/element-hover-card.tsx | 24 ++- .../routes/studio/context/node-context.tsx | 18 +- .../routes/studio/context/sorted-elements.tsx | 20 +- .../routes/studio/context/studio-context.tsx | 12 +- .../app/routes/studio/flow-to-xml-parser.ts | 56 +++--- .../frontend/app/routes/studio/studio.tsx | 12 +- .../app/routes/studio/xml-to-json-parser.ts | 54 +++--- .../services/configuration-file-service.ts | 4 +- .../app/services/project-service.spec.ts | 6 +- .../frontend/app/services/project-service.ts | 2 +- src/main/frontend/app/stores/git-store.ts | 2 +- .../frontend/app/stores/node-context-store.ts | 2 +- src/main/frontend/app/stores/tree-store.ts | 4 +- .../datamapper_utils/conversion-utils.ts | 4 +- .../utils/datamapper_utils/function-utils.ts | 8 +- .../utils/datamapper_utils/highlight-utils.ts | 8 +- .../datamapper_utils/property-node-utils.ts | 18 +- .../utils/datamapper_utils/schema-utils.ts | 48 ++--- src/main/frontend/app/utils/flow-utils.ts | 20 +- src/main/frontend/app/utils/xsd-utils.spec.ts | 12 +- src/main/frontend/app/utils/xsd-utils.ts | 125 +++++++------ 83 files changed, 731 insertions(+), 645 deletions(-) diff --git a/src/main/frontend/app/components/datamapper/forms/add-conditions-form.tsx b/src/main/frontend/app/components/datamapper/forms/add-conditions-form.tsx index 22ceedb9..51dc0400 100644 --- a/src/main/frontend/app/components/datamapper/forms/add-conditions-form.tsx +++ b/src/main/frontend/app/components/datamapper/forms/add-conditions-form.tsx @@ -211,7 +211,7 @@ function ConditionInputField({ onChange({ type: 'operator', value: val })} + onChange={(value_) => onChange({ type: 'operator', value: value_ })} options={Object.fromEntries(operatorConfig.allowedValues.map((option) => [option, option]))} /> diff --git a/src/main/frontend/app/components/datamapper/forms/add-mapping-form.tsx b/src/main/frontend/app/components/datamapper/forms/add-mapping-form.tsx index 8d6dfe56..0fa295ac 100644 --- a/src/main/frontend/app/components/datamapper/forms/add-mapping-form.tsx +++ b/src/main/frontend/app/components/datamapper/forms/add-mapping-form.tsx @@ -20,15 +20,15 @@ export type MappingModalProps = { } const updateArrayItem = (setter: Dispatch>, index: number, value: T) => { - setter((prev) => { - const next = [...prev] + setter((previous) => { + const next = [...previous] if (index >= 0 && index < next.length) next[index] = value return next }) } const deleteArrayItem = (setter: Dispatch>, index: number) => { - setter((prev) => prev.filter((_, i) => i !== index)) + setter((previous) => previous.filter((_, index_) => index_ !== index)) } function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalProps) { diff --git a/src/main/frontend/app/components/datamapper/react-flow/node-types.tsx b/src/main/frontend/app/components/datamapper/react-flow/node-types.tsx index f0a1158b..71745457 100644 --- a/src/main/frontend/app/components/datamapper/react-flow/node-types.tsx +++ b/src/main/frontend/app/components/datamapper/react-flow/node-types.tsx @@ -36,11 +36,13 @@ export const getNodeTypes = ({ data={{ ...properties.data, setNodes: setReactFlowNodes }} variant="source" onEdit={(data) => { - if (data) { - setEditingNode(data) - openModelType.current = 'source' - setAddFieldModal(true) + if (!data) { + return } + + setEditingNode(data) + openModelType.current = 'source' + setAddFieldModal(true) }} onDelete={(id) => flow.deleteNode(id)} onHighlight={(id) => flow.highlightFromPropertyNode(id)} @@ -52,11 +54,13 @@ export const getNodeTypes = ({ data={{ ...properties.data, setNodes: setReactFlowNodes }} variant="target" onEdit={(data) => { - if (data) { - setEditingNode(data) - openModelType.current = 'target' - setAddFieldModal(true) + if (!data) { + return } + + setEditingNode(data) + openModelType.current = 'target' + setAddFieldModal(true) }} onDelete={(id) => flow.deleteNode(id)} onHighlight={(id) => flow.highlightFromPropertyNode(id)} @@ -67,11 +71,13 @@ export const getNodeTypes = ({ {...node} onHighlight={(id) => flow.highlightFromPropertyNode(id)} onEdit={(data) => { - if (data) { - setEditingNode(data) - openModelType.current = 'target' - setAddFieldModal(true) + if (!data) { + return } + + setEditingNode(data) + openModelType.current = 'target' + setAddFieldModal(true) }} onDelete={(id) => flow.deleteNode(id)} /> diff --git a/src/main/frontend/app/components/file-structure/base-files-data-provider.ts b/src/main/frontend/app/components/file-structure/base-files-data-provider.ts index f2827060..e1a439a9 100644 --- a/src/main/frontend/app/components/file-structure/base-files-data-provider.ts +++ b/src/main/frontend/app/components/file-structure/base-files-data-provider.ts @@ -41,10 +41,12 @@ export abstract class BaseFilesDataProvider implements TreeData } public async onChangeItemChildren(itemId: TreeItemIndex, newChildren: TreeItemIndex[]) { - if (this.data[itemId]) { - this.data[itemId].children = newChildren - this.notifyListeners([itemId]) + if (!this.data[itemId]) { + return } + + this.data[itemId].children = newChildren + this.notifyListeners([itemId]) } public onDidChangeTreeData(listener: (changedItemIds: TreeItemIndex[]) => void): Disposable { diff --git a/src/main/frontend/app/components/file-structure/confirm-delete-dialog.tsx b/src/main/frontend/app/components/file-structure/confirm-delete-dialog.tsx index 820a0c19..66913d0e 100644 --- a/src/main/frontend/app/components/file-structure/confirm-delete-dialog.tsx +++ b/src/main/frontend/app/components/file-structure/confirm-delete-dialog.tsx @@ -3,15 +3,15 @@ import { createPortal } from 'react-dom' import Button from '~/components/inputs/button' import { useSubmitOnEnter } from '~/hooks/use-submit-on-enter' -type ConfirmDeleteDialogProps = { +type ConfirmDeleteDialogProperties = { name: string isFolder: boolean onConfirm: () => void onCancel: () => void } -export default function ConfirmDeleteDialog({ name, isFolder, onConfirm, onCancel }: ConfirmDeleteDialogProps) { - const overlayRef = useRef(null) +export default function ConfirmDeleteDialog({ name, isFolder, onConfirm, onCancel }: ConfirmDeleteDialogProperties) { + const overlayReference = useRef(null) useSubmitOnEnter(onConfirm) @@ -24,12 +24,12 @@ export default function ConfirmDeleteDialog({ name, isFolder, onConfirm, onCance }, [onCancel]) const handleOverlayClick = (e: React.MouseEvent) => { - if (e.target === overlayRef.current) onCancel() + if (e.target === overlayReference.current) onCancel() } return createPortal(
diff --git a/src/main/frontend/app/components/file-structure/context-menu.tsx b/src/main/frontend/app/components/file-structure/context-menu.tsx index 5289034f..7b4d9dcb 100644 --- a/src/main/frontend/app/components/file-structure/context-menu.tsx +++ b/src/main/frontend/app/components/file-structure/context-menu.tsx @@ -2,7 +2,7 @@ import { useRef } from 'react' import { createPortal } from 'react-dom' import { useContextMenuDismiss } from '~/hooks/use-context-menu-dismiss' -type ContextMenuProps = { +type ContextMenuProperties = { position: { x: number; y: number } isFolder: boolean isRoot?: boolean @@ -22,15 +22,15 @@ export default function ContextMenu({ onRename, onDelete, onClose, -}: ContextMenuProps) { - const menuRef = useRef(null) - useContextMenuDismiss(menuRef, onClose) +}: ContextMenuProperties) { + const menuReference = useRef(null) + useContextMenuDismiss(menuReference, onClose) const itemClass = 'px-3 py-1.5 cursor-pointer hover:bg-hover text-sm text-foreground whitespace-nowrap' return createPortal(
diff --git a/src/main/frontend/app/components/file-structure/editor-file-structure.tsx b/src/main/frontend/app/components/file-structure/editor-file-structure.tsx index 306c8fa2..25f64e30 100644 --- a/src/main/frontend/app/components/file-structure/editor-file-structure.tsx +++ b/src/main/frontend/app/components/file-structure/editor-file-structure.tsx @@ -63,10 +63,10 @@ export default function EditorFileStructure() { const [selectedItemId, setSelectedItemId] = useState(null) const [rootPath, setRootPath] = useState(null) - const expandedItemsRef = useRef(editorExpandedItems) + const expandedItemsReference = useRef(editorExpandedItems) useEffect(() => { - expandedItemsRef.current = editorExpandedItems + expandedItemsReference.current = editorExpandedItems }, [editorExpandedItems]) useFileWatcher(project?.name ?? null, () => { @@ -98,8 +98,8 @@ export default function EditorFileStructure() { const tab = getTab(oldPath) if (tab) { removeTab(oldPath) - const lastSep = Math.max(oldPath.lastIndexOf('/'), oldPath.lastIndexOf('\\')) - const newPath = oldPath.slice(0, Math.max(0, lastSep + 1)) + newName + const lastSeparator = Math.max(oldPath.lastIndexOf('/'), oldPath.lastIndexOf('\\')) + const newPath = oldPath.slice(0, Math.max(0, lastSeparator + 1)) + newName setTabData(newPath, { ...tab, name: newName, configurationPath: newPath }) setActiveTab(newPath) } @@ -196,7 +196,7 @@ export default function EditorFileStructure() { const initProvider = async () => { const provider = new EditorFilesDataProvider(project.name) - await provider.init(expandedItemsRef.current) + await provider.init(expandedItemsReference.current) if (isMounted) { setDataProvider(provider) @@ -287,10 +287,10 @@ export default function EditorFileStructure() { if (event.key === 'Tab' && !event.shiftKey) { event.preventDefault() - setActiveMatchIndex((i) => (i + 1) % matchingItemIds.length) + setActiveMatchIndex((index) => (index + 1) % matchingItemIds.length) } else if (event.key === 'Tab' && event.shiftKey) { event.preventDefault() - setActiveMatchIndex((i) => (i - 1 < 0 ? matchingItemIds.length - 1 : i - 1)) + setActiveMatchIndex((index) => (index - 1 < 0 ? matchingItemIds.length - 1 : index - 1)) } else if (event.key === 'Enter') { event.preventDefault() const target = highlightedItemId || matchingItemIds[0] diff --git a/src/main/frontend/app/components/file-structure/file-tree-dialogs.tsx b/src/main/frontend/app/components/file-structure/file-tree-dialogs.tsx index 368cce64..4c8b4248 100644 --- a/src/main/frontend/app/components/file-structure/file-tree-dialogs.tsx +++ b/src/main/frontend/app/components/file-structure/file-tree-dialogs.tsx @@ -3,7 +3,7 @@ import NameInputDialog from './name-input-dialog' import ConfirmDeleteDialog from './confirm-delete-dialog' import type { ContextMenuState, NameDialogState, DeleteTargetState } from './use-file-tree-context-menu' -type FileTreeDialogsProps = { +type FileTreeDialogsProperties = { contextMenu: ContextMenuState | null nameDialog: NameDialogState | null deleteTarget: DeleteTargetState | null @@ -29,7 +29,7 @@ export default function FileTreeDialogs({ onCloseContextMenu, onCloseNameDialog, onCloseDeleteDialog, -}: FileTreeDialogsProps) { +}: FileTreeDialogsProperties) { return ( <> {contextMenu && ( diff --git a/src/main/frontend/app/components/file-structure/inline-rename-input.tsx b/src/main/frontend/app/components/file-structure/inline-rename-input.tsx index c2397f7e..545dc114 100644 --- a/src/main/frontend/app/components/file-structure/inline-rename-input.tsx +++ b/src/main/frontend/app/components/file-structure/inline-rename-input.tsx @@ -1,7 +1,7 @@ import type { TreeItemIndex } from 'react-complex-tree' import Input from '~/components/inputs/input' -type InlineRenameInputProps = { +type InlineRenameInputProperties = { icon: React.ComponentType<{ className?: string }> value: string onChange: (value: string) => void @@ -17,7 +17,7 @@ export default function InlineRenameInput({ onSubmit, onCancel, itemIndex, -}: InlineRenameInputProps) { +}: InlineRenameInputProperties) { return (
e.preventDefault()}> diff --git a/src/main/frontend/app/components/file-structure/name-input-dialog.tsx b/src/main/frontend/app/components/file-structure/name-input-dialog.tsx index 3c6650be..a16c176a 100644 --- a/src/main/frontend/app/components/file-structure/name-input-dialog.tsx +++ b/src/main/frontend/app/components/file-structure/name-input-dialog.tsx @@ -28,7 +28,7 @@ export const PROJECT_NAME_PATTERNS: Record = { 'Cannot have a file extension': /^(?!.*\.[^.\\/]+$).*$/, } -type NameInputDialogProps = { +type NameInputDialogProperties = { title: string initialValue?: string submitLabel?: string @@ -44,10 +44,10 @@ export default function NameInputDialog({ onSubmit, onCancel, patterns = FOLDER_OR_ADAPTER_NAME_PATTERNS, -}: NameInputDialogProps) { +}: NameInputDialogProperties) { const [value, setValue] = useState(initialValue) const [isValid, setIsValid] = useState(false) - const overlayRef = useRef(null) + const overlayReference = useRef(null) const handleSubmit = () => { if (!isValid) return @@ -57,19 +57,21 @@ export default function NameInputDialog({ useSubmitOnEnter(handleSubmit) const handleKeyDown = (event: React.KeyboardEvent) => { - if (event.key === 'Escape') { - event.preventDefault() - onCancel() + if (event.key !== 'Escape') { + return } + + event.preventDefault() + onCancel() } const handleOverlayClick = (event: React.MouseEvent) => { - if (event.target === overlayRef.current) onCancel() + if (event.target === overlayReference.current) onCancel() } return createPortal(
diff --git a/src/main/frontend/app/components/file-structure/studio-context-menu.tsx b/src/main/frontend/app/components/file-structure/studio-context-menu.tsx index b677ed06..2a08337d 100644 --- a/src/main/frontend/app/components/file-structure/studio-context-menu.tsx +++ b/src/main/frontend/app/components/file-structure/studio-context-menu.tsx @@ -3,7 +3,7 @@ import { createPortal } from 'react-dom' import { useContextMenuDismiss } from '~/hooks/use-context-menu-dismiss' import type { StudioItemType } from './use-studio-context-menu' -type StudioContextMenuProps = { +type StudioContextMenuProperties = { position: { x: number; y: number } itemType: StudioItemType onNewConfiguration: () => void @@ -23,9 +23,9 @@ export default function StudioContextMenu({ onRename, onDelete, onClose, -}: StudioContextMenuProps) { - const menuRef = useRef(null) - useContextMenuDismiss(menuRef, onClose) +}: StudioContextMenuProperties) { + const menuReference = useRef(null) + useContextMenuDismiss(menuReference, onClose) const itemClass = 'px-3 py-1.5 cursor-pointer hover:bg-hover text-sm text-foreground whitespace-nowrap' @@ -36,7 +36,7 @@ export default function StudioContextMenu({ return createPortal(
diff --git a/src/main/frontend/app/components/file-structure/studio-file-structure.tsx b/src/main/frontend/app/components/file-structure/studio-file-structure.tsx index f92aa82c..d32e4231 100644 --- a/src/main/frontend/app/components/file-structure/studio-file-structure.tsx +++ b/src/main/frontend/app/components/file-structure/studio-file-structure.tsx @@ -40,20 +40,21 @@ import TreeActionButton from '../inputs/tree-action-button' const TREE_ID = 'studio-files-tree' function studioTabItemId(activeTab: string, dataProvider: StudioFilesDataProvider): string | null { - const firstSep = activeTab.indexOf('::') - if (firstSep === -1) return null - const configPath = activeTab.slice(0, firstSep) - const rest = activeTab.slice(firstSep + 2) - const lastSep = rest.lastIndexOf('::') - const adapterName = lastSep === -1 ? rest : rest.slice(0, lastSep) - const position = lastSep === -1 ? '0' : rest.slice(lastSep + 2) + const firstSeparator = activeTab.indexOf('::') + if (firstSeparator === -1) return null + const configPath = activeTab.slice(0, firstSeparator) + const rest = activeTab.slice(firstSeparator + 2) + const lastSeparator = rest.lastIndexOf('::') + const adapterName = lastSeparator === -1 ? rest : rest.slice(0, lastSeparator) + const position = lastSeparator === -1 ? '0' : rest.slice(lastSeparator + 2) return `${toTreeItemId(configPath, dataProvider.getRootPath())}/${adapterName}::${position}` } function getItemTitle(item: TreeItem): string { if (typeof item.data === 'string') { return item.data - } else if (typeof item.data === 'object' && item.data !== null) { + } + if (typeof item.data === 'object' && item.data !== null) { if ('adapterName' in item.data) { return (item.data as { adapterName: string }).adapterName } @@ -79,7 +80,7 @@ export default function StudioFileStructure() { const [providerLoading, setProviderLoading] = useState(false) const [selectedItemId, setSelectedItemId] = useState(null) const [selectedItemType, setSelectedItemType] = useState(null) - const treeContainerRef = useRef(null) + const treeContainerReference = useRef(null) const setTabData = useTabStore((state) => state.setTabData) const setActiveTab = useTabStore((state) => state.setActiveTab) const getTab = useTabStore((state) => state.getTab) @@ -95,9 +96,9 @@ export default function StudioFileStructure() { [activeTabItemId, studioExpandedItems], ) - const expandedItemsRef = useRef(studioExpandedItems) + const expandedItemsReference = useRef(studioExpandedItems) useEffect(() => { - expandedItemsRef.current = studioExpandedItems + expandedItemsReference.current = studioExpandedItems }, [studioExpandedItems]) useFileWatcher(project?.name ?? null, () => { @@ -178,7 +179,7 @@ export default function StudioFileStructure() { }, 'studio-explorer.delete': () => { if (!selectedItemId) return false - if (!treeContainerRef.current?.contains(document.activeElement)) return false + if (!treeContainerReference.current?.contains(document.activeElement)) return false triggerExplorerAction(studioContextMenu.handleDelete, true) }, 'studio-explorer.reveal': () => void revealActiveTab(), @@ -193,7 +194,7 @@ export default function StudioFileStructure() { setProviderLoading(true) const provider = new StudioFilesDataProvider(project.name) - await provider.init(expandedItemsRef.current) + await provider.init(expandedItemsReference.current) if (isMounted) { setDataProvider(provider) @@ -522,7 +523,7 @@ export default function StudioFileStructure() { setSearchTerm(event.target.value)} />
{ void studioContextMenu.openContextMenu(mouseEvent, 'root') @@ -540,7 +541,9 @@ export default function StudioFileStructure() { }} onCollapseItem={(item) => { removeStudioExpandedItem(String(item.index)) - setSelectedItemId((prev) => (prev && String(prev).startsWith(`${String(item.index)}/`) ? null : prev)) + setSelectedItemId((previous) => + previous && String(previous).startsWith(`${String(item.index)}/`) ? null : previous, + ) }} getItemTitle={getItemTitle} dataProvider={dataProvider} diff --git a/src/main/frontend/app/components/file-structure/studio-file-tree-dialogs.tsx b/src/main/frontend/app/components/file-structure/studio-file-tree-dialogs.tsx index 333b986e..2c06b34c 100644 --- a/src/main/frontend/app/components/file-structure/studio-file-tree-dialogs.tsx +++ b/src/main/frontend/app/components/file-structure/studio-file-tree-dialogs.tsx @@ -3,7 +3,7 @@ import NameInputDialog from './name-input-dialog' import ConfirmDeleteDialog from './confirm-delete-dialog' import type { StudioContextMenuState, NameDialogState, DeleteTargetState } from './use-studio-context-menu' -type StudioFileTreeDialogsProps = { +type StudioFileTreeDialogsProperties = { contextMenu: StudioContextMenuState | null nameDialog: NameDialogState | null deleteTarget: DeleteTargetState | null @@ -31,7 +31,7 @@ export default function StudioFileTreeDialogs({ onCloseContextMenu, onCloseNameDialog, onCloseDeleteDialog, -}: StudioFileTreeDialogsProps) { +}: StudioFileTreeDialogsProperties) { return ( <> {contextMenu && ( diff --git a/src/main/frontend/app/components/file-structure/studio-files-data-provider.ts b/src/main/frontend/app/components/file-structure/studio-files-data-provider.ts index 483f8ff0..4367d9c9 100644 --- a/src/main/frontend/app/components/file-structure/studio-files-data-provider.ts +++ b/src/main/frontend/app/components/file-structure/studio-files-data-provider.ts @@ -116,11 +116,11 @@ export default class StudioFilesDataProvider extends BaseFilesDataProvider parts.slice(0, i + 1).join('/')) + return parts.slice(0, -1).map((_, index) => parts.slice(0, index + 1).join('/')) } export function toTreeItemId(absolutePath: string, rootPath: string): string { @@ -43,10 +43,10 @@ export function isVisibleInTree(itemId: string | null, expandedItems: string[]): .every((id) => expandedItems.includes(id)) } -export function selectAndReveal(treeRef: TreeRef, itemId: string): void { +export function selectAndReveal(treeReference: TreeRef, itemId: string): void { setTimeout(() => { - treeRef.selectItems([itemId]) - treeRef.focusItem(itemId) + treeReference.selectItems([itemId]) + treeReference.focusItem(itemId) }, 50) } diff --git a/src/main/frontend/app/components/file-structure/use-file-tree-context-menu.ts b/src/main/frontend/app/components/file-structure/use-file-tree-context-menu.ts index 12d1ff0f..63667f19 100644 --- a/src/main/frontend/app/components/file-structure/use-file-tree-context-menu.ts +++ b/src/main/frontend/app/components/file-structure/use-file-tree-context-menu.ts @@ -53,9 +53,9 @@ type UseFileTreeContextMenuOptions = { const ALLOWED_EXTENSIONS = ['.xml', '.json', '.yaml', '.yml', '.properties'] export function getParentItemId(itemId: TreeItemIndex): TreeItemIndex { - const str = String(itemId) - const lastSlash = str.lastIndexOf('/') - return lastSlash > 0 ? str.slice(0, Math.max(0, lastSlash)) : 'root' + const string_ = String(itemId) + const lastSlash = string_.lastIndexOf('/') + return lastSlash > 0 ? string_.slice(0, Math.max(0, lastSlash)) : 'root' } function ensureHasCorrectExtension(name: string): boolean { @@ -66,8 +66,8 @@ function ensureHasCorrectExtension(name: string): boolean { } function buildNewPath(oldPath: string, newName: string): string { - const lastSep = Math.max(oldPath.lastIndexOf('/'), oldPath.lastIndexOf('\\')) - return oldPath.slice(0, Math.max(0, lastSep + 1)) + newName + const lastSeparator = Math.max(oldPath.lastIndexOf('/'), oldPath.lastIndexOf('\\')) + return oldPath.slice(0, Math.max(0, lastSeparator + 1)) + newName } export function useFileTreeContextMenu({ @@ -81,7 +81,7 @@ export function useFileTreeContextMenu({ const [contextMenu, setContextMenu] = useState(null) const [nameDialog, setNameDialog] = useState(null) const [deleteTarget, setDeleteTarget] = useState(null) - const contextMenuRef = useRef(null) + const contextMenuReference = useRef(null) const openContextMenu = useCallback( async (e: React.MouseEvent, itemId: TreeItemIndex) => { @@ -100,19 +100,19 @@ export function useFileTreeContextMenu({ path: item.data.path, name: item.data.name, } - contextMenuRef.current = state + contextMenuReference.current = state setContextMenu(state) }, [dataProvider], ) const closeContextMenu = useCallback(() => { - contextMenuRef.current = null + contextMenuReference.current = null setContextMenu(null) }, []) function resolveMenu(menuState?: ContextMenuState): ContextMenuState | null { - return menuState ?? contextMenuRef.current + return menuState ?? contextMenuReference.current } const handleNewFile = useCallback( @@ -197,7 +197,8 @@ export function useFileTreeContextMenu({ if (newName === oldName) { setNameDialog(null) return - } else if (!menu.isFolder && !ensureHasCorrectExtension(newName)) { + } + if (!menu.isFolder && !ensureHasCorrectExtension(newName)) { showErrorToast(`Filename must have one of the following extensions: ${ALLOWED_EXTENSIONS.join(', ')}`) return } diff --git a/src/main/frontend/app/components/file-structure/use-studio-context-menu.ts b/src/main/frontend/app/components/file-structure/use-studio-context-menu.ts index dd8c04c2..d7e2be77 100644 --- a/src/main/frontend/app/components/file-structure/use-studio-context-menu.ts +++ b/src/main/frontend/app/components/file-structure/use-studio-context-menu.ts @@ -125,7 +125,7 @@ export function useStudioContextMenu({ projectName, dataProvider }: UseStudioCon const [contextMenu, setContextMenu] = useState(null) const [nameDialog, setNameDialog] = useState(null) const [deleteTarget, setDeleteTarget] = useState(null) - const contextMenuRef = useRef(null) + const contextMenuReference = useRef(null) const openContextMenu = useCallback( async (e: React.MouseEvent, itemId: TreeItemIndex) => { @@ -148,19 +148,19 @@ export function useStudioContextMenu({ projectName, dataProvider }: UseStudioCon folderPath, name, } - contextMenuRef.current = state + contextMenuReference.current = state setContextMenu(state) }, [dataProvider], ) const closeContextMenu = useCallback(() => { - contextMenuRef.current = null + contextMenuReference.current = null setContextMenu(null) }, []) function resolveMenu(menuState?: StudioContextMenuState): StudioContextMenuState | null { - return menuState ?? contextMenuRef.current + return menuState ?? contextMenuReference.current } const handleNewConfigurationFile = useCallback( diff --git a/src/main/frontend/app/components/flow/add-subcomponent-modal.tsx b/src/main/frontend/app/components/flow/add-subcomponent-modal.tsx index 5327a494..5857f497 100644 --- a/src/main/frontend/app/components/flow/add-subcomponent-modal.tsx +++ b/src/main/frontend/app/components/flow/add-subcomponent-modal.tsx @@ -5,13 +5,17 @@ import Search from '~/components/search/search' import type { ElementDetails } from '@frankframework/doc-library-core' import { useEffect, useMemo, useState, type ChangeEvent } from 'react' -type AddSubcomponentModalProps = { +type AddSubcomponentModalProperties = { onClose: () => void possibleChildren: ElementDetails[] onAddChild: (element: ElementDetails) => void } -export default function AddSubcomponentModal({ onClose, possibleChildren, onAddChild }: AddSubcomponentModalProps) { +export default function AddSubcomponentModal({ + onClose, + possibleChildren, + onAddChild, +}: AddSubcomponentModalProperties) { const [search, setSearch] = useState('') const [selectedElement, setSelectedElement] = useState(null) diff --git a/src/main/frontend/app/components/flow/canvas-context-menu.tsx b/src/main/frontend/app/components/flow/canvas-context-menu.tsx index 567b1856..f516666f 100644 --- a/src/main/frontend/app/components/flow/canvas-context-menu.tsx +++ b/src/main/frontend/app/components/flow/canvas-context-menu.tsx @@ -3,7 +3,7 @@ import { createPortal } from 'react-dom' import { useContextMenuDismiss } from '~/hooks/use-context-menu-dismiss' import { useShortcutStore, formatShortcutParts } from '~/stores/shortcut-store' -type CanvasContextMenuProps = { +type CanvasContextMenuProperties = { position: { x: number; y: number } onClose: () => void onAddNote: () => void @@ -40,9 +40,9 @@ export default function CanvasContextMenu({ hasGroupedSelection, hasClipboard, hasSingleNodeSelection, -}: CanvasContextMenuProps) { - const menuRef = useRef(null) - useContextMenuDismiss(menuRef, onClose) +}: CanvasContextMenuProperties) { + const menuReference = useRef(null) + useContextMenuDismiss(menuReference, onClose) const itemClass = 'flex items-center justify-between gap-6 px-3 py-1.5 text-sm whitespace-nowrap' const enabledClass = `${itemClass} cursor-pointer hover:bg-hover text-foreground` @@ -69,7 +69,7 @@ export default function CanvasContextMenu({ return createPortal(
diff --git a/src/main/frontend/app/components/flow/create-node-modal.tsx b/src/main/frontend/app/components/flow/create-node-modal.tsx index 1ae00abf..9d624212 100644 --- a/src/main/frontend/app/components/flow/create-node-modal.tsx +++ b/src/main/frontend/app/components/flow/create-node-modal.tsx @@ -31,7 +31,7 @@ function getElementNamesForType(fullName: string, types: FFDocJson['types'], ele const fullNames = new Set(types[fullName]) return new Set( Object.entries(elements) - .filter(([_, el]) => fullNames.has(el.className)) + .filter(([_, element]) => fullNames.has(element.className)) .map(([name]) => name), ) } diff --git a/src/main/frontend/app/components/git/diff-tab-view.tsx b/src/main/frontend/app/components/git/diff-tab-view.tsx index 8749f49e..dff12b52 100644 --- a/src/main/frontend/app/components/git/diff-tab-view.tsx +++ b/src/main/frontend/app/components/git/diff-tab-view.tsx @@ -20,7 +20,7 @@ function applyHunkDecorations( modifiedEditor: CodeEditor, hunks: GitHunk[], selectedHunks: Set, - prevDecorations: string[], + previousDecorations: string[], ): string[] { const decorations: Parameters[1] = [] @@ -59,14 +59,14 @@ function applyHunkDecorations( } } - return modifiedEditor.deltaDecorations(prevDecorations, decorations) + return modifiedEditor.deltaDecorations(previousDecorations, decorations) } -type DiffTabViewProps = { +type DiffTabViewProperties = { diffData: DiffTabData } -export default function DiffTabView({ diffData }: DiffTabViewProps) { +export default function DiffTabView({ diffData }: DiffTabViewProperties) { const theme = useTheme() const { fileHunkStates, toggleFileHunk } = useGitStore( useShallow((s) => ({ @@ -81,28 +81,33 @@ export default function DiffTabView({ diffData }: DiffTabViewProps) { const hunkState = fileHunkStates[filePath] const selectedHunks = useMemo(() => hunkState?.selectedHunks ?? new Set(), [hunkState?.selectedHunks]) - const containerRef = useRef(null) - const diffEditorRef = useRef(null) - const decorationsRef = useRef([]) + const containerReference = useRef(null) + const diffEditorReference = useRef(null) + const decorationsReference = useRef([]) const [editorReady, setEditorReady] = useState(false) - const hunksRef = useRef(hunks) - hunksRef.current = hunks - const toggleRef = useRef(toggleFileHunk) - toggleRef.current = toggleFileHunk - const filePathRef = useRef(filePath) - filePathRef.current = filePath + const hunksReference = useRef(hunks) + hunksReference.current = hunks + const toggleReference = useRef(toggleFileHunk) + toggleReference.current = toggleFileHunk + const filePathReference = useRef(filePath) + filePathReference.current = filePath useEffect(() => { - if (!editorReady || !diffEditorRef.current) return - const modifiedEditor = diffEditorRef.current.getModifiedEditor() - decorationsRef.current = applyHunkDecorations(modifiedEditor, hunks, selectedHunks, decorationsRef.current) + if (!editorReady || !diffEditorReference.current) return + const modifiedEditor = diffEditorReference.current.getModifiedEditor() + decorationsReference.current = applyHunkDecorations( + modifiedEditor, + hunks, + selectedHunks, + decorationsReference.current, + ) }, [hunks, selectedHunks, editorReady]) useEffect(() => { - if (!containerRef.current) return + if (!containerReference.current) return - const diffEditor = monaco.editor.createDiffEditor(containerRef.current, { + const diffEditor = monaco.editor.createDiffEditor(containerReference.current, { readOnly: true, automaticLayout: true, renderSideBySide: true, @@ -111,16 +116,16 @@ export default function DiffTabView({ diffData }: DiffTabViewProps) { glyphMargin: true, }) - diffEditorRef.current = diffEditor + diffEditorReference.current = diffEditor const modifiedEditor = diffEditor.getModifiedEditor() modifiedEditor.updateOptions({ glyphMargin: true }) - decorationsRef.current = applyHunkDecorations( + decorationsReference.current = applyHunkDecorations( modifiedEditor, - hunksRef.current, - useGitStore.getState().fileHunkStates[filePathRef.current]?.selectedHunks ?? new Set(), - decorationsRef.current, + hunksReference.current, + useGitStore.getState().fileHunkStates[filePathReference.current]?.selectedHunks ?? new Set(), + decorationsReference.current, ) modifiedEditor.onMouseDown((e) => { @@ -129,10 +134,10 @@ export default function DiffTabView({ diffData }: DiffTabViewProps) { const lineNumber = e.target.position?.lineNumber if (lineNumber == null) return - for (const hunk of hunksRef.current) { + for (const hunk of hunksReference.current) { if (hunk.newCount <= 0) continue if (lineNumber >= hunk.newStart && lineNumber < hunk.newStart + hunk.newCount) { - toggleRef.current(filePathRef.current, hunk.index) + toggleReference.current(filePathReference.current, hunk.index) return } } @@ -143,14 +148,14 @@ export default function DiffTabView({ diffData }: DiffTabViewProps) { return () => { diffEditor.dispose() - diffEditorRef.current = null - decorationsRef.current = [] + diffEditorReference.current = null + decorationsReference.current = [] setEditorReady(false) } }, []) useEffect(() => { - const diffEditor = diffEditorRef.current + const diffEditor = diffEditorReference.current if (!diffEditor || !editorReady) return const originalModel = monaco.editor.createModel(diffData.oldContent, language) @@ -192,7 +197,7 @@ export default function DiffTabView({ diffData }: DiffTabViewProps) { {filePath}
-
+
) diff --git a/src/main/frontend/app/components/git/git-changes.tsx b/src/main/frontend/app/components/git/git-changes.tsx index ccee2e4f..370e1c2d 100644 --- a/src/main/frontend/app/components/git/git-changes.tsx +++ b/src/main/frontend/app/components/git/git-changes.tsx @@ -3,7 +3,7 @@ import clsx from 'clsx' import type { GitStatus, FileHunkState } from '~/types/git.types' import Checkbox from '~/components/inputs/checkbox' -type GitChangesProps = { +type GitChangesProperties = { status: GitStatus | null selectedFile: string | null fileHunkStates: Record @@ -112,7 +112,7 @@ export default function GitChanges({ fileHunkStates, onSelectFile, onToggleFile, -}: GitChangesProps) { +}: GitChangesProperties) { if (!status) return null const changedFiles = [...new Set([...status.staged, ...status.modified])] diff --git a/src/main/frontend/app/components/git/git-commit-box.tsx b/src/main/frontend/app/components/git/git-commit-box.tsx index ef21adc3..102d919f 100644 --- a/src/main/frontend/app/components/git/git-commit-box.tsx +++ b/src/main/frontend/app/components/git/git-commit-box.tsx @@ -1,6 +1,6 @@ import Button from '~/components/inputs/button' -type GitCommitBoxProps = { +type GitCommitBoxProperties = { commitMessage: string onMessageChange: (message: string) => void onCommit: () => void @@ -14,7 +14,7 @@ export default function GitCommitBox({ onCommit, hasSelectedChunks, isLoading, -}: GitCommitBoxProps) { +}: GitCommitBoxProperties) { const canCommit = hasSelectedChunks && !!commitMessage.trim() && !isLoading return ( @@ -26,10 +26,12 @@ export default function GitCommitBox({ className="border-border bg-background text-foreground placeholder:text-foreground-muted w-full resize-none rounded border p-2.5 text-xs focus:outline-none" rows={4} onKeyDown={(keyboardEvent) => { - if (keyboardEvent.key === 'Enter' && (keyboardEvent.ctrlKey || keyboardEvent.metaKey)) { - keyboardEvent.preventDefault() - if (canCommit) onCommit() + if (!(keyboardEvent.key === 'Enter' && (keyboardEvent.ctrlKey || keyboardEvent.metaKey))) { + return } + + keyboardEvent.preventDefault() + if (canCommit) onCommit() }} />
) diff --git a/src/main/frontend/app/components/sidebars-layout/sidebar-layout.tsx b/src/main/frontend/app/components/sidebars-layout/sidebar-layout.tsx index 8bd2d146..5c913e4a 100644 --- a/src/main/frontend/app/components/sidebars-layout/sidebar-layout.tsx +++ b/src/main/frontend/app/components/sidebars-layout/sidebar-layout.tsx @@ -30,7 +30,7 @@ export default function SidebarLayout({ [visibleRaw, defaultVisible], ) const childrenArray = React.Children.toArray(children) - const allotmentRef = useRef(null) + const allotmentReference = useRef(null) const [allotmentReady, setAllotmentReady] = useState(false) useEffect(() => { @@ -38,12 +38,12 @@ export default function SidebarLayout({ }, [initializeInstance, name, defaultVisible]) useLayoutEffect(() => { - if (!allotmentReady || !allotmentRef.current) return + if (!allotmentReady || !allotmentReference.current) return if (sizes.length === 0) return const target = sizes.map((size, index) => (visible[index] ? size : 0)) if (hideLeft) target.shift() - allotmentRef.current.resize(target) + allotmentReference.current.resize(target) }, [sizes, visible, allotmentReady, hideLeft]) const handleVisibilityChange = (index: SidebarSide, value: boolean) => { @@ -68,7 +68,7 @@ export default function SidebarLayout({ {sizes && visible.length > 0 && ( = { +type TabsViewProperties = { tabs: Record activeTab: T | null onSelectTab: (key: T) => void onCloseTab: (key: T) => void } -export function TabsView({ tabs, activeTab, onSelectTab, onCloseTab }: TabsViewProps) { +export function TabsView({ tabs, activeTab, onSelectTab, onCloseTab }: TabsViewProperties) { const tabsListReference = useRef(null) const shadowLeftReference = useRef(null) const shadowRightReference = useRef(null) diff --git a/src/main/frontend/app/hooks/use-async.ts b/src/main/frontend/app/hooks/use-async.ts index 3d5a11e1..44f16d3b 100644 --- a/src/main/frontend/app/hooks/use-async.ts +++ b/src/main/frontend/app/hooks/use-async.ts @@ -13,7 +13,7 @@ type UseAsyncResult = { } export function useAsync( - asyncFn: (signal: AbortSignal) => Promise, + asyncFunction: (signal: AbortSignal) => Promise, options?: UseAsyncOptions, ): UseAsyncResult { const enabled = options?.enabled ?? true @@ -23,27 +23,29 @@ export function useAsync( const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState(null) - const asyncFnRef = useRef(asyncFn) - asyncFnRef.current = asyncFn + const asyncFunctionReference = useRef(asyncFunction) + asyncFunctionReference.current = asyncFunction - const abortControllerRef = useRef(null) + const abortControllerReference = useRef(null) useEffect(() => { if (!enabled) return const abortController = new AbortController() - abortControllerRef.current = abortController + abortControllerReference.current = abortController setIsLoading(true) setError(null) - asyncFnRef + asyncFunctionReference .current(abortController.signal) .then((result) => { - if (!abortController.signal.aborted) { - setData(result) - setIsLoading(false) + if (abortController.signal.aborted) { + return } + + setData(result) + setIsLoading(false) }) .catch((error_) => { if (error_?.name === 'AbortError' || abortController.signal.aborted) return @@ -57,20 +59,22 @@ export function useAsync( }, [enabled, key]) const refetch = useCallback(() => { - abortControllerRef.current?.abort() + abortControllerReference.current?.abort() const abortController = new AbortController() - abortControllerRef.current = abortController + abortControllerReference.current = abortController setIsLoading(true) setError(null) - asyncFnRef + asyncFunctionReference .current(abortController.signal) .then((result) => { - if (!abortController.signal.aborted) { - setData(result) - setIsLoading(false) + if (abortController.signal.aborted) { + return } + + setData(result) + setIsLoading(false) }) .catch((error_) => { if (error_?.name === 'AbortError' || abortController.signal.aborted) return diff --git a/src/main/frontend/app/hooks/use-context-menu-dismiss.ts b/src/main/frontend/app/hooks/use-context-menu-dismiss.ts index e51d0fc9..dd1c10b2 100644 --- a/src/main/frontend/app/hooks/use-context-menu-dismiss.ts +++ b/src/main/frontend/app/hooks/use-context-menu-dismiss.ts @@ -3,10 +3,10 @@ import { useEffect, type RefObject } from 'react' /** * Closes a context menu when the user clicks outside it, right-clicks outside it, or presses Escape. */ -export function useContextMenuDismiss(menuRef: RefObject, onClose: () => void) { +export function useContextMenuDismiss(menuReference: RefObject, onClose: () => void) { useEffect(() => { const handleClickOutside = (e: MouseEvent) => { - if (menuRef.current && !menuRef.current.contains(e.target as Node)) { + if (menuReference.current && !menuReference.current.contains(e.target as Node)) { onClose() } } @@ -22,5 +22,5 @@ export function useContextMenuDismiss(menuRef: RefObject, document.removeEventListener('contextmenu', handleClickOutside) document.removeEventListener('keydown', handleKeyDown) } - }, [menuRef, onClose]) + }, [menuReference, onClose]) } diff --git a/src/main/frontend/app/hooks/use-datamapper-flow-management.ts b/src/main/frontend/app/hooks/use-datamapper-flow-management.ts index 40ce70ab..81305666 100644 --- a/src/main/frontend/app/hooks/use-datamapper-flow-management.ts +++ b/src/main/frontend/app/hooks/use-datamapper-flow-management.ts @@ -58,23 +58,25 @@ export function useFlowManagement({ useEffect(() => { const updatePosition = (event: MouseEvent) => { - if (scrollIntervalEnabled.current) { - const bottomThreshold = window.innerHeight - SCROLL_PANE_HEIGHT - if (event.clientY < SCROLL_PANE_HEIGHT) { - reactFlowInstance.setViewport({ - x: reactFlowInstance.getViewport().x, - y: reactFlowInstance.getViewport().y + SCROLL_AMOUNT, - zoom: 1, //Don't set this to 0, it results in NaN for X & Y - }) - } + if (!scrollIntervalEnabled.current) { + return + } - if (event.clientY > bottomThreshold) { - reactFlowInstance.setViewport({ - x: reactFlowInstance.getViewport().x, - y: reactFlowInstance.getViewport().y - SCROLL_AMOUNT, - zoom: 1, //Don't set this to 0, it results in NaN for X & Y - }) - } + const bottomThreshold = window.innerHeight - SCROLL_PANE_HEIGHT + if (event.clientY < SCROLL_PANE_HEIGHT) { + reactFlowInstance.setViewport({ + x: reactFlowInstance.getViewport().x, + y: reactFlowInstance.getViewport().y + SCROLL_AMOUNT, + zoom: 1, //Don't set this to 0, it results in NaN for X & Y + }) + } + + if (event.clientY > bottomThreshold) { + reactFlowInstance.setViewport({ + x: reactFlowInstance.getViewport().x, + y: reactFlowInstance.getViewport().y - SCROLL_AMOUNT, + zoom: 1, //Don't set this to 0, it results in NaN for X & Y + }) } } @@ -379,7 +381,7 @@ export function useFlowManagement({ async function clearTarget() { setReactFlowNodes((previous: Node[]) => { - let updatedNodes = previous.filter((node) => !node.parentId?.startsWith('target')) + const updatedNodes = previous.filter((node) => !node.parentId?.startsWith('target')) return updatedNodes }) } diff --git a/src/main/frontend/app/hooks/use-file-watcher.ts b/src/main/frontend/app/hooks/use-file-watcher.ts index fdd361bb..4fdfa9f7 100644 --- a/src/main/frontend/app/hooks/use-file-watcher.ts +++ b/src/main/frontend/app/hooks/use-file-watcher.ts @@ -10,8 +10,8 @@ type WatcherEntry = { const watchers = new Map() function useSseWatcher(url: string | null, onFileChange?: () => void) { - const callbackRef = useRef(onFileChange) - callbackRef.current = onFileChange + const callbackReference = useRef(onFileChange) + callbackReference.current = onFileChange useEffect(() => { if (!url) return @@ -29,7 +29,7 @@ function useSseWatcher(url: string | null, onFileChange?: () => void) { watchers.set(url, entry) } - const handler = () => callbackRef.current?.() + const handler = () => callbackReference.current?.() entry.handlers.add(handler) entry.source.addEventListener('file-change', handler) diff --git a/src/main/frontend/app/hooks/use-shortcut-listener.ts b/src/main/frontend/app/hooks/use-shortcut-listener.ts index ac037e04..dcc66640 100644 --- a/src/main/frontend/app/hooks/use-shortcut-listener.ts +++ b/src/main/frontend/app/hooks/use-shortcut-listener.ts @@ -16,10 +16,10 @@ function matchesShortcut(event: KeyboardEvent, shortcut: ShortcutDefinition, pla if (!key || event.key.toLowerCase() !== key) return false const mods = getPlatformValue(shortcut.modifiers, platform) ?? {} - const cmdOrCtrl = event.metaKey || event.ctrlKey + const commandOrCtrl = event.metaKey || event.ctrlKey return ( - (mods.cmdOrCtrl ?? false) === cmdOrCtrl && + (mods.cmdOrCtrl ?? false) === commandOrCtrl && (mods.shift ?? false) === event.shiftKey && (mods.alt ?? false) === event.altKey ) @@ -45,26 +45,26 @@ function canExecuteShortcut( export function useShortcutListener() { const location = useLocation() - const pathnameRef = useRef(location.pathname) - const shortcutsRef = useRef(useShortcutStore.getState().shortcuts) - const platformRef = useRef(useShortcutStore.getState().platform) + const pathnameReference = useRef(location.pathname) + const shortcutsReference = useRef(useShortcutStore.getState().shortcuts) + const platformReference = useRef(useShortcutStore.getState().platform) useEffect(() => { return useShortcutStore.subscribe((state) => { - shortcutsRef.current = state.shortcuts - platformRef.current = state.platform + shortcutsReference.current = state.shortcuts + platformReference.current = state.platform }) }, []) useEffect(() => { - pathnameRef.current = location.pathname + pathnameReference.current = location.pathname }, [location.pathname]) useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { - const pathname = pathnameRef.current - const shortcuts = shortcutsRef.current - const platform = platformRef.current + const pathname = pathnameReference.current + const shortcuts = shortcutsReference.current + const platform = platformReference.current for (const shortcut of shortcuts.values()) { if (!canExecuteShortcut(shortcut, pathname, event, platform)) { diff --git a/src/main/frontend/app/hooks/use-shortcut.ts b/src/main/frontend/app/hooks/use-shortcut.ts index 29615850..da7b4106 100644 --- a/src/main/frontend/app/hooks/use-shortcut.ts +++ b/src/main/frontend/app/hooks/use-shortcut.ts @@ -4,18 +4,18 @@ import { useShortcutStore } from '~/stores/shortcut-store' type ShortcutHandlers = Record boolean | void> export function useShortcut(handlers: ShortcutHandlers) { - const handlersRef = useRef(handlers) - handlersRef.current = handlers + const handlersReference = useRef(handlers) + handlersReference.current = handlers const ids = Object.keys(handlers).join(',') useEffect(() => { const { setHandler } = useShortcutStore.getState() - const handlerIds = Object.keys(handlersRef.current) + const handlerIds = Object.keys(handlersReference.current) for (const id of handlerIds) { setHandler(id, () => { - return handlersRef.current[id]?.() + return handlersReference.current[id]?.() }) } diff --git a/src/main/frontend/app/hooks/use-submit-on-enter.ts b/src/main/frontend/app/hooks/use-submit-on-enter.ts index ff89c4d9..91554d52 100644 --- a/src/main/frontend/app/hooks/use-submit-on-enter.ts +++ b/src/main/frontend/app/hooks/use-submit-on-enter.ts @@ -1,8 +1,8 @@ import { useEffect, useRef } from 'react' export function useSubmitOnEnter(onSubmit: () => void, enabled = true) { - const onSubmitRef = useRef(onSubmit) - onSubmitRef.current = onSubmit + const onSubmitReference = useRef(onSubmit) + onSubmitReference.current = onSubmit useEffect(() => { if (!enabled) return @@ -11,7 +11,7 @@ export function useSubmitOnEnter(onSubmit: () => void, enabled = true) { if (event.key !== 'Enter') return if (document.activeElement instanceof HTMLButtonElement) return event.preventDefault() - onSubmitRef.current() + onSubmitReference.current() } document.addEventListener('keydown', handleKeyDown) diff --git a/src/main/frontend/app/providers/frankconfig-xsd-provider.tsx b/src/main/frontend/app/providers/frankconfig-xsd-provider.tsx index 0fb6be37..e61641ad 100644 --- a/src/main/frontend/app/providers/frankconfig-xsd-provider.tsx +++ b/src/main/frontend/app/providers/frankconfig-xsd-provider.tsx @@ -30,10 +30,10 @@ export function FrankConfigXsdProvider({ children }: { children: ReactNode }) { load() }, [load]) - const xsdDoc = useMemo(() => (xsdContent ? parseXsd(xsdContent) : null), [xsdContent]) + const xsdDocument = useMemo(() => (xsdContent ? parseXsd(xsdContent) : null), [xsdContent]) return ( - + {children} ) diff --git a/src/main/frontend/app/routes/configurations/configuration-file-tile.tsx b/src/main/frontend/app/routes/configurations/configuration-file-tile.tsx index b10852fb..578c8f66 100644 --- a/src/main/frontend/app/routes/configurations/configuration-file-tile.tsx +++ b/src/main/frontend/app/routes/configurations/configuration-file-tile.tsx @@ -14,7 +14,7 @@ import { isRootConfiguration } from './configuration-utils' import AdapterListItem from './adapter-list-item' import ComponentListItem from './component-list-item' import { frankdocChipStyle } from '~/utils/flow-utils' -import clsx from "clsx"; +import clsx from 'clsx' type ConfigurationFileTileProperties = { filepath: string diff --git a/src/main/frontend/app/routes/configurations/configuration-overview.tsx b/src/main/frontend/app/routes/configurations/configuration-overview.tsx index 7b98b7b5..0ac91c2e 100644 --- a/src/main/frontend/app/routes/configurations/configuration-overview.tsx +++ b/src/main/frontend/app/routes/configurations/configuration-overview.tsx @@ -70,13 +70,13 @@ export default function ConfigurationOverview() { const [draggedComponentTagName, setDraggedComponentTagName] = useState(null) const [tileView, setTileView] = useState('list') - const sidebarVisibleBeforeEditRef = useRef(true) + const sidebarVisibleBeforeEditReference = useRef(true) const setSidebarVisible = useSidebarStore((state) => state.setVisible) const getSidebarVisibility = useSidebarStore((state) => state.getVisibility) const captureSidebarVisibility = useCallback(() => { - sidebarVisibleBeforeEditRef.current = getSidebarVisibility(SIDEBAR_NAME)?.[SidebarSide.RIGHT] ?? true + sidebarVisibleBeforeEditReference.current = getSidebarVisibility(SIDEBAR_NAME)?.[SidebarSide.RIGHT] ?? true }, [getSidebarVisibility]) const openEditor = useCallback( @@ -156,10 +156,12 @@ export default function ConfigurationOverview() { setIsLoading(true) fetchProjectTree(currentConfigurationProject.name, signal) .then((data) => { - if (!signal?.aborted) { - setTree(data) - setIsLoading(false) + if (signal?.aborted) { + return } + + setTree(data) + setIsLoading(false) }) .catch(() => { if (!signal?.aborted) { @@ -246,7 +248,7 @@ export default function ConfigurationOverview() { (configurationPath: string, components: NonCanvasComponent[]) => { replaceComponents(configurationPath, components) closeEditor() - setSidebarVisible(SIDEBAR_NAME, SidebarSide.RIGHT, sidebarVisibleBeforeEditRef.current) + setSidebarVisible(SIDEBAR_NAME, SidebarSide.RIGHT, sidebarVisibleBeforeEditReference.current) }, [replaceComponents, closeEditor, setSidebarVisible], ) diff --git a/src/main/frontend/app/routes/datamapper/property-list.tsx b/src/main/frontend/app/routes/datamapper/property-list.tsx index bc3cb5b8..6e9ee783 100644 --- a/src/main/frontend/app/routes/datamapper/property-list.tsx +++ b/src/main/frontend/app/routes/datamapper/property-list.tsx @@ -87,10 +87,10 @@ function PropertyList({ config, configDispatch }: PropertyListProperties) { const [mappingTargets, setMappingTargets] = useState([]) const canvasWidth = useRef(null) - const editingMappingRef = useRef(null) + const editingMappingReference = useRef(null) useEffect(() => { - editingMappingRef.current = editingMapping + editingMappingReference.current = editingMapping }, [editingMapping]) const flow = useFlowManagement({ @@ -108,10 +108,10 @@ function PropertyList({ config, configDispatch }: PropertyListProperties) { const { sources, targets, unfilteredSources } = getMappingNodes( nodes, edges, - editingMappingRef.current || undefined, + editingMappingReference.current || undefined, ) - if (!editingMappingRef.current) { + if (!editingMappingReference.current) { const error = validateMapping(sources, targets, unfilteredSources) if (error) { showErrorToast(error) @@ -136,9 +136,8 @@ function PropertyList({ config, configDispatch }: PropertyListProperties) { if (error instanceof Error) { showErrorToast(error.message) return - } else { - throw error } + throw error } } diff --git a/src/main/frontend/app/routes/datamapper/root.tsx b/src/main/frontend/app/routes/datamapper/root.tsx index c4fb68f5..5eec7bb1 100644 --- a/src/main/frontend/app/routes/datamapper/root.tsx +++ b/src/main/frontend/app/routes/datamapper/root.tsx @@ -26,18 +26,20 @@ export default function DataMapperRoot() { useEffect(() => { const loadConfig = async () => { - if (project) { - const config = await fetchDatamapperConfiguration(project.name) - if (config) { - dispatchMappingListConfig({ - type: 'IMPORT_CONFIG', - payload: config, - }) + if (!project) { + return + } - setRoute(config.stage == 'Mapping' ? 'Properties' : 'Initialize') - } else { - setRoute('Initialize') - } + const config = await fetchDatamapperConfiguration(project.name) + if (config) { + dispatchMappingListConfig({ + type: 'IMPORT_CONFIG', + payload: config, + }) + + setRoute(config.stage == 'Mapping' ? 'Properties' : 'Initialize') + } else { + setRoute('Initialize') } } diff --git a/src/main/frontend/app/routes/editor/editor.tsx b/src/main/frontend/app/routes/editor/editor.tsx index 86e57908..b8efd2bc 100644 --- a/src/main/frontend/app/routes/editor/editor.tsx +++ b/src/main/frontend/app/routes/editor/editor.tsx @@ -70,17 +70,17 @@ function extractLocalName(name: string): string { } function findElementRange(lineContent: string, localName: string): { startColumn: number; endColumn: number } | null { - const openIdx = lineContent.indexOf(`<${localName}`) - if (openIdx !== -1) return { startColumn: openIdx + 1, endColumn: openIdx + 1 + localName.length + 1 } - const closeIdx = lineContent.indexOf(` ({ - ...err, - lineNumber: err.lineNumber + startLine, + return mapToValidationErrors(flowResult.errors, model).map((error) => ({ + ...error, + lineNumber: error.lineNumber + startLine, startColumn: 1, - endColumn: model.getLineLength(err.lineNumber + startLine), + endColumn: model.getLineLength(error.lineNumber + startLine), })) } @@ -254,17 +254,17 @@ export default function CodeEditor() { const [leftTab, setLeftTab] = useState('files') const [editorMounted, setEditorMounted] = useState(false) const [xsdLoaded, setXsdLoaded] = useState(false) - const containerRef = useRef(null) + const containerReference = useRef(null) const editorReference = useRef(null) - const xsdContentRef = useRef(null) - const errorDecorationsRef = useRef<{ clear: () => void } | null>(null) - const flowDecorationsRef = useRef(null) - const highlightDecorationsRef = useRef(null) - const frankGlyphsDecorationsRef = useRef(null) - const frankElementsRef = useRef>([]) - const debounceTimerRef = useRef | null>(null) - const validationTimerRef = useRef | null>(null) - const validationCounterRef = useRef(0) + const xsdContentReference = useRef(null) + const errorDecorationsReference = useRef<{ clear: () => void } | null>(null) + const flowDecorationsReference = useRef(null) + const highlightDecorationsReference = useRef(null) + const frankGlyphsDecorationsReference = useRef(null) + const frankElementsReference = useRef>([]) + const debounceTimerReference = useRef | null>(null) + const validationTimerReference = useRef | null>(null) + const validationCounterReference = useRef(0) const contentCacheRef = useRef>(new Map()) const syncingValueRef = useRef(false) const navigate = useNavigate() @@ -306,10 +306,10 @@ export default function CodeEditor() { const decorations = matches.flatMap((match) => mapMatchToDecorations(match)) - if (flowDecorationsRef.current) { - flowDecorationsRef.current.set(decorations) + if (flowDecorationsReference.current) { + flowDecorationsReference.current.set(decorations) } else { - flowDecorationsRef.current = editor.createDecorationsCollection(decorations) + flowDecorationsReference.current = editor.createDecorationsCollection(decorations) } }, [fileLanguage]) @@ -319,7 +319,7 @@ export default function CodeEditor() { if (!editor || fileLanguage !== 'xml') return const elements = findFrankElementsForGlyphs(content) - frankElementsRef.current = elements + frankElementsReference.current = elements const decorations = elements.map((element) => { const isAdapter = element.subtype === ADAPTER_GLYPH_SUBTYPE @@ -334,10 +334,10 @@ export default function CodeEditor() { } }) - if (frankGlyphsDecorationsRef.current) { - frankGlyphsDecorationsRef.current.set(decorations) + if (frankGlyphsDecorationsReference.current) { + frankGlyphsDecorationsReference.current.set(decorations) } else if (decorations.length > 0) { - frankGlyphsDecorationsRef.current = editor.createDecorationsCollection(decorations) + frankGlyphsDecorationsReference.current = editor.createDecorationsCollection(decorations) } }, [fileLanguage], @@ -384,9 +384,9 @@ export default function CodeEditor() { ) const flushPendingSave = useCallback(() => { - if (debounceTimerRef.current) { - clearTimeout(debounceTimerRef.current) - debounceTimerRef.current = null + if (debounceTimerReference.current) { + clearTimeout(debounceTimerReference.current) + debounceTimerReference.current = null performSave() } }, [performSave]) @@ -396,17 +396,17 @@ export default function CodeEditor() { const scheduleSave = useCallback(() => { if (!autosaveEnabled) return - if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current) - debounceTimerRef.current = setTimeout(() => { - debounceTimerRef.current = null + if (debounceTimerReference.current) clearTimeout(debounceTimerReference.current) + debounceTimerReference.current = setTimeout(() => { + debounceTimerReference.current = null performSave() }, autosaveDelay) }, [performSave, autosaveEnabled, autosaveDelay]) useEffect(() => { return () => { - if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current) - if (validationTimerRef.current) clearTimeout(validationTimerRef.current) + if (debounceTimerReference.current) clearTimeout(debounceTimerReference.current) + if (validationTimerReference.current) clearTimeout(validationTimerReference.current) } }, []) @@ -417,13 +417,13 @@ export default function CodeEditor() { const model = editor.getModel() if (!model) return - if (errorDecorationsRef.current) { - errorDecorationsRef.current.clear() - errorDecorationsRef.current = null + if (errorDecorationsReference.current) { + errorDecorationsReference.current.clear() + errorDecorationsReference.current = null } if (errors.length > 0) { - errorDecorationsRef.current = editor.createDecorationsCollection(errors.map((element) => toDecoration(element))) + errorDecorationsReference.current = editor.createDecorationsCollection(errors.map((element) => toDecoration(element))) } monaco.editor.setModelMarkers( @@ -462,10 +462,10 @@ export default function CodeEditor() { const runSchemaValidation = useCallback( async (content: string) => { const editor = editorReference.current - const xsdContent = xsdContentRef.current + const xsdContent = xsdContentReference.current if (!editor || !xsdContent) return - const validationId = ++validationCounterRef.current + const validationId = ++validationCounterReference.current const model = editor.getModel() as ITextModel if (!model) return @@ -475,11 +475,11 @@ export default function CodeEditor() { validateConfiguration(content, xsdContent, model), ]) - if (validationId !== validationCounterRef.current) return + if (validationId !== validationCounterReference.current) return applyValidationDecorations([...frankErrors, ...flowErrors]) } catch { - if (validationId === validationCounterRef.current && !model.isDisposed()) { + if (validationId === validationCounterReference.current && !model.isDisposed()) { applyValidationDecorations([notWellFormedError(model)]) } } @@ -489,26 +489,26 @@ export default function CodeEditor() { const scheduleSchemaValidation = useCallback( (content: string) => { - if (validationTimerRef.current) clearTimeout(validationTimerRef.current) - validationTimerRef.current = setTimeout(() => { - validationTimerRef.current = null + if (validationTimerReference.current) clearTimeout(validationTimerReference.current) + validationTimerReference.current = setTimeout(() => { + validationTimerReference.current = null runSchemaValidation(content) }, 800) }, [runSchemaValidation], ) - const performSaveRef = useRef(performSave) - const runReformatRef = useRef(runReformat) + const performSaveReference = useRef(performSave) + const runReformatReference = useRef(runReformat) const scheduleSaveRef = useRef(scheduleSave) const onChangeRef = useRef<((value: string) => void) | null>(null) useEffect(() => { - performSaveRef.current = performSave + performSaveReference.current = performSave }, [performSave]) useEffect(() => { - runReformatRef.current = runReformat + runReformatReference.current = runReformat }, [runReformat]) useEffect(() => { @@ -536,7 +536,7 @@ export default function CodeEditor() { fetchFrankConfigXsd() .then((xsdContent) => { - xsdContentRef.current = xsdContent + xsdContentReference.current = xsdContent xsdManager.set({ path: 'FrankConfig.xsd', value: xsdContent, namespace: 'xs', alwaysInclude: true }) xsdManager.set({ path: 'FlowConfig.xsd', value: flowXsd, namespace: 'xs', alwaysInclude: true }) setXsdLoaded(true) @@ -547,9 +547,9 @@ export default function CodeEditor() { const showCodeEditor = !!activeTabFilePath && !isDiffTab useEffect(() => { - if (!showCodeEditor || !containerRef.current || editorReference.current) return + if (!showCodeEditor || !containerReference.current || editorReference.current) return - const editor = monaco.editor.create(containerRef.current, { + const editor = monaco.editor.create(containerReference.current, { value: '', language: 'xml', automaticLayout: true, @@ -561,7 +561,7 @@ export default function CodeEditor() { }) editorReference.current = editor - frankGlyphsDecorationsRef.current = null + frankGlyphsDecorationsReference.current = null setEditorMounted(true) editor.addAction({ @@ -571,11 +571,11 @@ export default function CodeEditor() { contextMenuOrder: 1, keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyS], run: () => { - if (debounceTimerRef.current) { - clearTimeout(debounceTimerRef.current) - debounceTimerRef.current = null + if (debounceTimerReference.current) { + clearTimeout(debounceTimerReference.current) + debounceTimerReference.current = null } - performSaveRef.current() + performSaveReference.current() }, }) @@ -585,13 +585,13 @@ export default function CodeEditor() { contextMenuGroupId: 'navigation', contextMenuOrder: 3, keybindings: [monaco.KeyMod.Alt | monaco.KeyMod.Shift | monaco.KeyCode.KeyF], - run: () => runReformatRef.current(), + run: () => runReformatReference.current(), }) editor.onMouseDown((event) => { - if (highlightDecorationsRef.current) { - highlightDecorationsRef.current.clear() - highlightDecorationsRef.current = null + if (highlightDecorationsReference.current) { + highlightDecorationsReference.current.clear() + highlightDecorationsReference.current = null } if (event.target.type === monaco.editor.MouseTargetType.GUTTER_GLYPH_MARGIN) { @@ -601,7 +601,7 @@ export default function CodeEditor() { const editorTab = useEditorTabStore.getState().getTab(useEditorTabStore.getState().activeTabFilePath) if (!editorTab) return - const element = frankElementsRef.current.find((element) => element.startLine === lineNumber) + const element = frankElementsReference.current.find((element) => element.startLine === lineNumber) if (!element) return const { adapterName, adapterPosition, subtype, name } = element @@ -682,11 +682,13 @@ export default function CodeEditor() { if (isDiffTab) return function setMonacoContent(content: string, type: string, abortSignal?: AbortSignal) { - if (!abortSignal || !abortSignal.aborted) { - contentCacheRef.current.set(activeTabFilePath, { type, content }) - setFileContent(content) - setFileLanguage(type) + if (abortSignal && abortSignal.aborted) { + return } + + contentCacheRef.current.set(activeTabFilePath, { type, content }) + setFileContent(content) + setFileLanguage(type) } const abortController = new AbortController() @@ -722,26 +724,28 @@ export default function CodeEditor() { setMonacoContent(content, fileType, abortController.signal) }) .catch((error) => { - if (!abortController.signal.aborted) { - setMonacoContent('', 'plaintext', abortController.signal) - logApiError('Failed to load file:', error) + if (abortController.signal.aborted) { + return } + + setMonacoContent('', 'plaintext', abortController.signal) + logApiError('Failed to load file:', error) }) } return () => abortController.abort() }, [project, activeTabFilePath, isDiffTab, refreshCounter]) useEffect(() => { - if (errorDecorationsRef.current) { - errorDecorationsRef.current.clear() - errorDecorationsRef.current = null + if (errorDecorationsReference.current) { + errorDecorationsReference.current.clear() + errorDecorationsReference.current = null } - if (flowDecorationsRef.current) { - flowDecorationsRef.current.set([]) + if (flowDecorationsReference.current) { + flowDecorationsReference.current.set([]) } - if (frankGlyphsDecorationsRef.current) { - frankGlyphsDecorationsRef.current.clear() - frankGlyphsDecorationsRef.current = null + if (frankGlyphsDecorationsReference.current) { + frankGlyphsDecorationsReference.current.clear() + frankGlyphsDecorationsReference.current = null } const editor = editorReference.current const model = editor?.getModel() @@ -807,9 +811,9 @@ export default function CodeEditor() { editor.setPosition({ lineNumber: range.startLine, column: 1 }) editor.focus() - highlightDecorationsRef.current?.clear() + highlightDecorationsReference.current?.clear() - highlightDecorationsRef.current = editor.createDecorationsCollection([ + highlightDecorationsReference.current = editor.createDecorationsCollection([ { range: { startLineNumber: range.startLine, startColumn: 1, endLineNumber: range.endLine, endColumn: 1 }, options: { isWholeLine: true, className: 'highlight-line' }, @@ -860,7 +864,7 @@ export default function CodeEditor() {
-
+
) diff --git a/src/main/frontend/app/routes/editor/xml-utils.ts b/src/main/frontend/app/routes/editor/xml-utils.ts index 3ec736ba..5446a191 100644 --- a/src/main/frontend/app/routes/editor/xml-utils.ts +++ b/src/main/frontend/app/routes/editor/xml-utils.ts @@ -94,11 +94,11 @@ function analyzeTagStructure(lines: string[], startLine: number): { isSelfClosin function extractNameAttribute(lines: string[], startLine: number): string | null { const searchLimit = Math.min(startLine + MAX_LOOKAHEAD_LINES, lines.length) - for (let i = startLine; i < searchLimit; i++) { - const match = lines[i].match(REGEX_NAME_ATTR) + for (let index = startLine; index < searchLimit; index++) { + const match = lines[index].match(REGEX_NAME_ATTR) if (match) return match[1] - const isTagEnding = lines[i].includes('/>') || (/[^/]>\s*$/.test(lines[i]) && i > startLine) + const isTagEnding = lines[index].includes('/>') || (/[^/]>\s*$/.test(lines[index]) && index > startLine) if (isTagEnding) break } @@ -108,12 +108,12 @@ function extractNameAttribute(lines: string[], startLine: number): string | null function hasNameAttributeWithinTag(lines: string[], startLine: number, targetName: string): boolean { const searchLimit = Math.min(startLine + MAX_LOOKAHEAD_LINES, lines.length) - for (let i = startLine; i < searchLimit; i++) { - if (lines[i].includes(`name="${targetName}"`) || lines[i].includes(`name='${targetName}'`)) { + for (let index = startLine; index < searchLimit; index++) { + if (lines[index].includes(`name="${targetName}"`) || lines[index].includes(`name='${targetName}'`)) { return true } - if (i > startLine && REGEX_NEW_TAG_START.test(lines[i])) { + if (index > startLine && REGEX_NEW_TAG_START.test(lines[index])) { return false } } @@ -137,8 +137,8 @@ export function lineToOffset(xml: string, lineNumber: number): number { const lines = xml.split('\n') let offset = 0 - for (let i = 0; i < lineNumber - 1 && i < lines.length; i++) { - offset += lines[i].length + 1 + for (let index = 0; index < lineNumber - 1 && index < lines.length; index++) { + offset += lines[index].length + 1 } return offset @@ -147,16 +147,16 @@ export function lineToOffset(xml: string, lineNumber: number): number { export function offsetToLine(xml: string, offset: number): number { let line = 1 - for (let i = 0; i < offset && i < xml.length; i++) { - if (xml[i] === '\n') line++ + for (let index = 0; index < offset && index < xml.length; index++) { + if (xml[index] === '\n') line++ } return line } export function findAdapterIndexAtOffset(adapters: AdapterLocation[], cursorOffset: number): number { - for (let i = adapters.length - 1; i >= 0; i--) { - if (adapters[i].offset <= cursorOffset) return i + for (let index = adapters.length - 1; index >= 0; index--) { + if (adapters[index].offset <= cursorOffset) return index } return 0 } @@ -185,13 +185,13 @@ export function findElementInXml(xml: string, subtype: string, name?: string): n const lines = xml.split('\n') const targetTag = `<${subtype}` - for (let i = 0; i < lines.length; i++) { - if (!lines[i].includes(targetTag)) continue + for (let index = 0; index < lines.length; index++) { + if (!lines[index].includes(targetTag)) continue - if (!name) return i + 1 + if (!name) return index + 1 - if (hasNameAttributeWithinTag(lines, i, name)) { - return i + 1 + if (hasNameAttributeWithinTag(lines, index, name)) { + return index + 1 } } diff --git a/src/main/frontend/app/routes/help/help-image.tsx b/src/main/frontend/app/routes/help/help-image.tsx index 333cc309..e8a47255 100644 --- a/src/main/frontend/app/routes/help/help-image.tsx +++ b/src/main/frontend/app/routes/help/help-image.tsx @@ -1,13 +1,13 @@ import React from 'react' -type HelpImageProps = { +type HelpImageProperties = { src: string alt?: string caption?: string width?: number | string } -export const HelpImage: React.FC = ({ src, alt = '', caption, width = '100%' }) => { +export const HelpImage: React.FC = ({ src, alt = '', caption, width = '100%' }) => { return (
{alt} diff --git a/src/main/frontend/app/routes/help/help.tsx b/src/main/frontend/app/routes/help/help.tsx index 0c37b1aa..79825715 100644 --- a/src/main/frontend/app/routes/help/help.tsx +++ b/src/main/frontend/app/routes/help/help.tsx @@ -10,8 +10,8 @@ import HelpTopics from '~/routes/help/help-topics' const firstTopic = HelpTopicTreeItems['root']?.children?.[0] as string export default function Help() { - const params = useParams() - const topic: string | null = params.topic ?? null + const parameters = useParams() + const topic: string | null = parameters.topic ?? null const helpTopicKey = topic ?? firstTopic const helpTopic: HelpTopicTreeItem | undefined = HelpTopicTreeItems[helpTopicKey] diff --git a/src/main/frontend/app/routes/help/keybinds-table.tsx b/src/main/frontend/app/routes/help/keybinds-table.tsx index cecb5671..d2cffec0 100644 --- a/src/main/frontend/app/routes/help/keybinds-table.tsx +++ b/src/main/frontend/app/routes/help/keybinds-table.tsx @@ -31,9 +31,9 @@ function formatKeybind(shortcut: Omit, platform: return ( <> - {parts.map((part, i) => ( - - {i > 0 && ' + '} + {parts.map((part, index) => ( + + {index > 0 && ' + '} {part} ))} @@ -63,17 +63,17 @@ export function KeybindsTable() { return (
- {[...grouped.entries()].map(([scope, defs]) => ( + {[...grouped].map(([scope, defs]) => (

{scopeLabels[scope] ?? `${capitalize(scope)} Keybinds`}

Action
Keybinds
- {defs.map((shortcut, i) => ( + {defs.map((shortcut, index) => (
{shortcut.label}
{formatKeybind(shortcut, platform)}
diff --git a/src/main/frontend/app/routes/projectlanding/project-landing.tsx b/src/main/frontend/app/routes/projectlanding/project-landing.tsx index bf4d7a77..864f979f 100644 --- a/src/main/frontend/app/routes/projectlanding/project-landing.tsx +++ b/src/main/frontend/app/routes/projectlanding/project-landing.tsx @@ -49,7 +49,7 @@ export default function ProjectLanding() { const [ffConfiguration, setFFConfiguration] = useState([]) const [ffInstanceName, setFFInstanceName] = useState('') const [maxImportBytes, setMaxImportBytes] = useState(DEFAULT_MAX_IMPORT_BYTES) - const importInputRef = useRef(null) + const importInputReference = useRef(null) useEffect(() => { clearProjectState() @@ -163,7 +163,6 @@ export default function ProjectLanding() { } } - // eslint-disable-next-line unicorn/consistent-function-scoping const onExportProject = async (projectName: string) => { try { await exportProject(projectName) @@ -202,8 +201,8 @@ export default function ProjectLanding() { setIsOpeningProject(false) } - if (importInputRef.current) { - importInputRef.current.value = '' + if (importInputReference.current) { + importInputReference.current.value = '' } } @@ -227,7 +226,7 @@ export default function ProjectLanding() { onNewClick={() => setIsModalOpen(true)} onOpenClick={() => setIsDirectoryPickerOpen(true)} onCloneClick={() => setIsCloneModalOpen(true)} - onImportClick={() => importInputRef.current?.click()} + onImportClick={() => importInputReference.current?.click()} /> ) { const handleTypes = useHandleTypes(typesAllowed) - const menuRef = useRef(null) + const menuReference = useRef(null) useEffect(() => { const handleMouseDown = (e: MouseEvent) => { - if (menuRef.current && !menuRef.current.contains(e.target as Node)) { + if (menuReference.current && !menuReference.current.contains(e.target as Node)) { onClose() } } const handleWheel = (e: WheelEvent) => { - if (menuRef.current && !menuRef.current.contains(e.target as Node)) { + if (menuReference.current && !menuReference.current.contains(e.target as Node)) { onClose() } } const handleEsc = (e: KeyboardEvent) => { - if (e.key === 'Escape') { - e.stopPropagation() - onClose() + if (e.key !== 'Escape') { + return } + + e.stopPropagation() + onClose() } globalThis.addEventListener('keydown', handleEsc, { capture: true }) @@ -56,7 +58,7 @@ export default function HandleMenu({ return createPortal(
>({}) if (isFulfilled || missingChildren.length === 0) return null const toggle = (index: number) => { - setExpandedMap((prev) => ({ - ...prev, - [index]: !prev[index], + setExpandedMap((previous) => ({ + ...previous, + [index]: !previous[index], })) } diff --git a/src/main/frontend/app/routes/studio/canvas/nodetypes/frank-node.tsx b/src/main/frontend/app/routes/studio/canvas/nodetypes/frank-node.tsx index e9ed6e6d..b814950a 100644 --- a/src/main/frontend/app/routes/studio/canvas/nodetypes/frank-node.tsx +++ b/src/main/frontend/app/routes/studio/canvas/nodetypes/frank-node.tsx @@ -185,12 +185,14 @@ export default function FrankNode(properties: NodeProps) { }, [availableHandleTypes, properties.data.sourceHandles]) useEffect(() => { - if (dragOver && containerReference.current) { - updateNodeInternals(properties.id) - - const newHeight = containerReference.current.offsetHeight - setDimensions((previous) => ({ ...previous, height: newHeight })) + if (!(dragOver && containerReference.current)) { + return } + + updateNodeInternals(properties.id) + + const newHeight = containerReference.current.offsetHeight + setDimensions((previous) => ({ ...previous, height: newHeight })) }, [dragOver, properties.id, updateNodeInternals]) useEffect(() => { @@ -213,17 +215,19 @@ export default function FrankNode(properties: NodeProps) { }, [mandatoryChildren, properties.data.children]) useLayoutEffect(() => { - if (containerReference.current) { - const measuredHeight = containerReference.current.offsetHeight - const scrollHeight = containerReference.current.scrollHeight - setIsOverflowing(scrollHeight > measuredHeight + 4) - setDimensions((previous) => { - if (Math.abs(previous.height - measuredHeight) > 2) { - return { ...previous, height: measuredHeight } - } - return previous - }) + if (!containerReference.current) { + return } + + const measuredHeight = containerReference.current.offsetHeight + const scrollHeight = containerReference.current.scrollHeight + setIsOverflowing(scrollHeight > measuredHeight + 4) + setDimensions((previous) => { + if (Math.abs(previous.height - measuredHeight) > 2) { + return { ...previous, height: measuredHeight } + } + return previous + }) }, [properties.data.children, properties.data.sourceHandles.length, dragOver]) useEffect(() => { @@ -276,7 +280,7 @@ export default function FrankNode(properties: NodeProps) { y: clientY, }) - setIsHandleMenuOpen((prev) => !prev) + setIsHandleMenuOpen((previous) => !previous) } const editChild = (childId: string) => { @@ -477,7 +481,7 @@ export default function FrankNode(properties: NodeProps) { className={`bg-background border-border relative flex flex-col items-center overflow-x-visible rounded-md border shadow-md ${isManuallyResized ? 'h-full w-full overflow-y-hidden' : 'overflow-y-visible'}`} style={{ minWidth: `${minNodeWidth}px`, - ...(isManuallyResized ? {} : { width: 'max-content', maxWidth: `${maxNodeWidth}px` }), + ...(!isManuallyResized && { width: 'max-content', maxWidth: `${maxNodeWidth}px` }), ...(properties.selected && { borderColor: `var(${colorVariable})` }), }} ref={containerReference} diff --git a/src/main/frontend/app/routes/studio/canvas/nodetypes/sticky-note.tsx b/src/main/frontend/app/routes/studio/canvas/nodetypes/sticky-note.tsx index 130a3d70..bba73eb6 100644 --- a/src/main/frontend/app/routes/studio/canvas/nodetypes/sticky-note.tsx +++ b/src/main/frontend/app/routes/studio/canvas/nodetypes/sticky-note.tsx @@ -34,8 +34,8 @@ export default function StickyNoteComponent(properties: NodeProps) { const minWidth = FlowConfig.STICKY_NOTE_DEFAULT_WIDTH const showNodeContextMenu = useNodeContextMenu() const updateNodeInternals = useUpdateNodeInternals() - const containerRef = useRef(null) - const contentRef = useRef(null) + const containerReference = useRef(null) + const contentReference = useRef(null) const [isOverflowing, setIsOverflowing] = useState(false) const color = properties.data.color ?? 'var(--sticky-color-yellow)' @@ -44,9 +44,9 @@ export default function StickyNoteComponent(properties: NodeProps) { const CONTENT_PADDING_Y = 24 useLayoutEffect(() => { - if (properties.data.collapsed || !contentRef.current) return + if (properties.data.collapsed || !contentReference.current) return - const naturalHeight = contentRef.current.scrollHeight + CONTENT_PADDING_Y + const naturalHeight = contentReference.current.scrollHeight + CONTENT_PADDING_Y const clamped = Math.min( FlowConfig.STICKY_NOTE_MAX_HEIGHT, Math.max(FlowConfig.STICKY_NOTE_DEFAULT_HEIGHT, naturalHeight), @@ -61,7 +61,7 @@ export default function StickyNoteComponent(properties: NodeProps) { useEffect(() => { if (properties.data.collapsed) return - const container = containerRef.current + const container = containerReference.current if (!container) return const check = () => setIsOverflowing(container.scrollHeight > container.clientHeight) check() @@ -134,7 +134,7 @@ export default function StickyNoteComponent(properties: NodeProps) {
) { `, }} > -
+
{content}
{isOverflowing && ( diff --git a/src/main/frontend/app/routes/studio/context/context-input.tsx b/src/main/frontend/app/routes/studio/context/context-input.tsx index 37015ac0..75d79a75 100644 --- a/src/main/frontend/app/routes/studio/context/context-input.tsx +++ b/src/main/frontend/app/routes/studio/context/context-input.tsx @@ -58,16 +58,18 @@ export default function ContextInput({ } function DescriptionHelpIcon({ description, elements }: Readonly<{ description: string; elements: Elements | null }>) { - const ref = useRef(null) + const reference = useRef(null) const [anchorRect, setAnchorRect] = useState(null) const [show, setShow] = useState(false) const transformed = useJavadocTransform(description, elements) const handleMouseEnter = () => { - if (ref.current) { - setAnchorRect(ref.current.getBoundingClientRect()) - setShow(true) + if (!reference.current) { + return } + + setAnchorRect(reference.current.getBoundingClientRect()) + setShow(true) } const handleMouseLeave = () => { @@ -77,7 +79,7 @@ function DescriptionHelpIcon({ description, elements }: Readonly<{ description: return ( <>
) { - const ref = useRef(null) + const reference = useRef(null) const [anchorRect, setAnchorRect] = useState(null) const [show, setShow] = useState(false) if (!deprecated) return null const handleMouseEnter = () => { - if (ref.current) { - setAnchorRect(ref.current.getBoundingClientRect()) - setShow(true) + if (!reference.current) { + return } + + setAnchorRect(reference.current.getBoundingClientRect()) + setShow(true) } const handleMouseLeave = () => { @@ -118,7 +122,7 @@ function DeprecatedIcon({ deprecated }: Readonly<{ deprecated: DeprecatedInfo }> return ( <> -
+
diff --git a/src/main/frontend/app/routes/studio/context/element-hover-card.tsx b/src/main/frontend/app/routes/studio/context/element-hover-card.tsx index da5db360..87ffbca8 100644 --- a/src/main/frontend/app/routes/studio/context/element-hover-card.tsx +++ b/src/main/frontend/app/routes/studio/context/element-hover-card.tsx @@ -7,7 +7,7 @@ import LinkButton from '~/components/inputs/link-button' import { frankdocChipStyle, getFirstLabelGroup } from '~/utils/flow-utils' import ExternalLinkIcon from '../../../../icons/solar/External Link.svg?react' -type ElementHoverCardProps = { +type ElementHoverCardProperties = { anchorRect: DOMRect element: ElementDetails onUnlock?: () => void @@ -15,8 +15,14 @@ type ElementHoverCardProps = { onLeave?: () => void } -export default function ElementHoverCard({ anchorRect, element, onUnlock, onEnter, onLeave }: ElementHoverCardProps) { - const ref = useRef(null) +export default function ElementHoverCard({ + anchorRect, + element, + onUnlock, + onEnter, + onLeave, +}: ElementHoverCardProperties) { + const reference = useRef(null) const [position, setPosition] = useState<{ top: number; left: number }>({ top: 0, left: 0 }) const offset = 10 // distance between anchor and tooltip const [labelGroup, label] = getFirstLabelGroup(element.labels) @@ -28,9 +34,9 @@ export default function ElementHoverCard({ anchorRect, element, onUnlock, onEnte }) useLayoutEffect(() => { - if (!ref.current || !anchorRect) return + if (!reference.current || !anchorRect) return - const tooltip = ref.current + const tooltip = reference.current const tooltipHeight = tooltip.offsetHeight const tooltipWidth = tooltip.offsetWidth @@ -46,13 +52,13 @@ export default function ElementHoverCard({ anchorRect, element, onUnlock, onEnte useEffect(() => { function handleClickOutside(event: MouseEvent) { - if (!ref.current) return - if (!ref.current.contains(event.target as Node)) { + if (!reference.current) return + if (!reference.current.contains(event.target as Node)) { onUnlock?.() } } - document.addEventListener('pointerdown', handleClickOutside, true) + document.addEventListener('pointerdown', handleClickOutside, { capture: true }) return () => document.removeEventListener('pointerdown', handleClickOutside, true) }, [onUnlock]) @@ -62,7 +68,7 @@ export default function ElementHoverCard({ anchorRect, element, onUnlock, onEnte return createPortal(
{ - if (canSaveRef.current) handleSaveRef.current() + if (canSaveReference.current) handleSaveReference.current() }, }) @@ -360,7 +360,7 @@ export default function NodeContext({ return ( <>
- {currentName &&

{currentName}

} + {currentName &&

{currentName}

} {canHideForwards && (
diff --git a/src/main/frontend/app/routes/studio/context/sorted-elements.tsx b/src/main/frontend/app/routes/studio/context/sorted-elements.tsx index dff4ed00..e45633fc 100644 --- a/src/main/frontend/app/routes/studio/context/sorted-elements.tsx +++ b/src/main/frontend/app/routes/studio/context/sorted-elements.tsx @@ -30,21 +30,23 @@ export default function SortedElements({ type, items, onDragStart, searchTerm }: const [deprecatedHovered, setDeprecatedHovered] = useState(null) const [lockedElement, setLockedElement] = useState(null) - const lockedElementRef = useRef(null) - lockedElementRef.current = lockedElement - const closeTimeoutRef = useRef | null>(null) + const lockedElementReference = useRef(null) + lockedElementReference.current = lockedElement + const closeTimeoutReference = useRef | null>(null) const cancelClose = useCallback(() => { - if (closeTimeoutRef.current !== null) { - clearTimeout(closeTimeoutRef.current) - closeTimeoutRef.current = null + if (closeTimeoutReference.current === null) { + return } + + clearTimeout(closeTimeoutReference.current) + closeTimeoutReference.current = null }, []) const scheduleClose = useCallback(() => { cancelClose() - closeTimeoutRef.current = setTimeout(() => { - if (lockedElementRef.current) return + closeTimeoutReference.current = setTimeout(() => { + if (lockedElementReference.current) return setHoveredElement(null) setHoveredRect(null) @@ -160,7 +162,7 @@ export default function SortedElements({ type, items, onDragStart, searchTerm }: }} onEnter={() => { cancelClose() - setLockedElement((prev) => prev ?? hoveredElement) + setLockedElement((previous) => previous ?? hoveredElement) }} onLeave={() => { setLockedElement(null) diff --git a/src/main/frontend/app/routes/studio/context/studio-context.tsx b/src/main/frontend/app/routes/studio/context/studio-context.tsx index 75fa564c..b9474cd7 100644 --- a/src/main/frontend/app/routes/studio/context/studio-context.tsx +++ b/src/main/frontend/app/routes/studio/context/studio-context.tsx @@ -18,7 +18,7 @@ export default function StudioContext() { const { setDraggedName, setAllowedOnCanvas } = useNodeContextStore((state) => state) const [searchTerm, setSearchTerm] = useState('') const project = useProjectStore((state) => state.project) - const { filters, elements, isLoading, error: ffDocError, refetch: refetchFFDoc } = useFFDoc() + const { filters, elements, isLoading, error: ffDocumentError, refetch: refetchFDocument } = useFFDoc() const { xsdDoc, error: xsdError, refetch: refetchXsd } = useFrankConfigXsd() const { allowed, elementsAllowedOnCanvas } = useMemo(() => { @@ -36,7 +36,7 @@ export default function StudioContext() { }, [xsdDoc]) const isReady = !isLoading && !!elements && allowed !== null - const hasError = ffDocError !== null || xsdError !== null + const hasError = ffDocumentError !== null || xsdError !== null const [timedOut, setTimedOut] = useState(false) @@ -49,7 +49,7 @@ export default function StudioContext() { const retry = () => { setTimedOut(false) - refetchFFDoc() + refetchFDocument() refetchXsd() } @@ -76,11 +76,11 @@ export default function StudioContext() { : [] const componentLookup = filters?.Components - ? Object.entries(filters.Components).reduce>((acc, [type, names]) => { + ? Object.entries(filters.Components).reduce>((accumulator, [type, names]) => { for (const name of names) { - acc[name] = type + accumulator[name] = type } - return acc + return accumulator }, {}) : {} diff --git a/src/main/frontend/app/routes/studio/flow-to-xml-parser.ts b/src/main/frontend/app/routes/studio/flow-to-xml-parser.ts index d06ef2db..71fa3bf6 100644 --- a/src/main/frontend/app/routes/studio/flow-to-xml-parser.ts +++ b/src/main/frontend/app/routes/studio/flow-to-xml-parser.ts @@ -137,9 +137,9 @@ function buildEdgeMaps(edges: Edge[]) { function getAdapterAttributes(adapterXml: string): string { const parser = new DOMParser() - const doc = parser.parseFromString(adapterXml, 'application/xml') - const adapterElement = doc.documentElement - return [...adapterElement.attributes].map((attr) => `${attr.name}="${attr.value}"`).join(' ') + const document = parser.parseFromString(adapterXml, 'application/xml') + const adapterElement = document.documentElement + return [...adapterElement.attributes].map((attribute) => `${attribute.name}="${attribute.value}"`).join(' ') } function topologicalSort(startNodes: string[], outgoing: Record): string[] { @@ -178,15 +178,15 @@ function generateXmlElement( const attributes = (node.data as NodeData).attributes || {} const children = (node.data as NodeData).children || [] - const allAttrs: Record = { + const allAttributes: Record = { ...attributes, name, 'flow:x': String(roundedX), 'flow:y': String(roundedY), - ...(height === null ? {} : { 'flow:width': String(width), 'flow:height': String(height) }), - ...((node.data as NodeData).hiddenForwards ? { 'flow:hiddenForwards': 'true' } : {}), + ...(height !== null && { 'flow:width': String(width), 'flow:height': String(height) }), + ...((node.data as NodeData).hiddenForwards && { 'flow:hiddenForwards': 'true' }), } - const attrStr = Object.entries(allAttrs) + const attributeString = Object.entries(allAttributes) .map(([k, v]) => `${k}="${escapeXml(v)}"`) .join(' ') @@ -217,31 +217,33 @@ function generateXmlElement( .join('\n') const content = [childXml, forwards].filter(Boolean).join('\n') - return content ? ` <${subtype} ${attrStr} >\n${content}\n ` : ` <${subtype} ${attrStr} />` + return content + ? ` <${subtype} ${attributeString} >\n${content}\n ` + : ` <${subtype} ${attributeString} />` } function generateChildXml(child: ChildNode, indent: number): string { const spaces = ' '.repeat(indent) - const childAttrs: Record = { - ...(child.name ? { name: child.name } : {}), + const childAttributes: Record = { + ...(child.name && { name: child.name }), ...child.attributes, } - const attrStr = Object.entries(childAttrs) + const attributeString = Object.entries(childAttributes) .map(([k, v]) => `${k}="${escapeXml(v)}"`) .join(' ') - const attrs = attrStr ? ` ${attrStr}` : '' + const attributes = attributeString ? ` ${attributeString}` : '' const hasChildren = child.children && child.children.length > 0 if (!hasChildren) { - return `${spaces}<${child.subtype}${attrs}/>` + return `${spaces}<${child.subtype}${attributes}/>` } const childXmlStrings = child.children!.map((nested) => generateChildXml(nested, indent + 2)) - return `${spaces}<${child.subtype}${attrs}> + return `${spaces}<${child.subtype}${attributes}> ${childXmlStrings.join('\n')} ${spaces}` } @@ -261,20 +263,20 @@ function generateExitsXml(exitNodes: FlowNode[]): string { height = node.measured.height } - const allAttrs: Record = { + const allAttributes: Record = { ...data.attributes, name, 'flow:x': String(roundedX), 'flow:y': String(roundedY), 'flow:width': String(width), 'flow:height': String(height), - ...(data.hiddenForwards ? { 'flow:hiddenForwards': 'true' } : {}), + ...(data.hiddenForwards && { 'flow:hiddenForwards': 'true' }), } - const attrStr = Object.entries(allAttrs) + const attributeString = Object.entries(allAttributes) .map(([k, v]) => `${k}="${escapeXml(v)}"`) .join(' ') - return ` ` + return ` ` }) .join('\n') } @@ -301,7 +303,7 @@ function generateFlowElementsXml(nodes: FlowNode[]): string { const roundedY = Math.round(y) const text = stickynote.data?.content || '' const color = stickynote.data?.color - const colorAttr = color ? ` flow:color="${escapeXml(color)}"` : '' + const colorAttribute = color ? ` flow:color="${escapeXml(color)}"` : '' let width: number let height: number @@ -314,17 +316,17 @@ function generateFlowElementsXml(nodes: FlowNode[]): string { height = stickynote.measured?.height ?? FlowConfig.STICKY_NOTE_DEFAULT_HEIGHT } - const collapsedAttr = stickynote.data?.collapsed === true ? ` flow:collapsed="true"` : '' + const collapsedAttribute = stickynote.data?.collapsed === true ? ` flow:collapsed="true"` : '' - let attachedToAttr = '' + let attachedToAttribute = '' if (stickynote.data?.attachedToNodeId) { const frankNode = nodes.find((node) => isFrankNode(node) && node.id === stickynote.data.attachedToNodeId) if (frankNode && isFrankNode(frankNode)) { - attachedToAttr = ` flow:attachedTo="${escapeXml(frankNode.data.name)}"` + attachedToAttribute = ` flow:attachedTo="${escapeXml(frankNode.data.name)}"` } } - return ` ', ']]]]>')}]]>` + return ` ', ']]]]>')}]]>` }) const groupNodesXml = generateGroupNodeXml(groupNodes, groupChildrenMap) @@ -357,7 +359,7 @@ function generateGroupNodeXml(groupNodes: GroupNode[], groupChildrenMap: Map` + return ` ` }) } diff --git a/src/main/frontend/app/routes/studio/studio.tsx b/src/main/frontend/app/routes/studio/studio.tsx index b6c38a34..2571ef8c 100644 --- a/src/main/frontend/app/routes/studio/studio.tsx +++ b/src/main/frontend/app/routes/studio/studio.tsx @@ -21,7 +21,7 @@ import type { StickyNote } from '~/routes/studio/canvas/nodetypes/sticky-note' import { ALL_SHORTCUTS, formatShortcutParts, useShortcutStore } from '~/stores/shortcut-store' import GroupContext from '~/routes/studio/context/group-context' -type RightPanelProps = { +type RightPanelProperties = { isMultiSelect: boolean selectedStickyId: string | null selectedGroupId: string | null @@ -124,7 +124,7 @@ function RightPanelContent({ showNodeContext, nodeId, onShowNodeContext, -}: RightPanelProps) { +}: RightPanelProperties) { const showPalette = !isMultiSelect && !selectedStickyId && !selectedGroupId && !showNodeContext return ( @@ -193,10 +193,12 @@ export default function Studio() { ) useEffect(() => { - if (selectedStickyId && !stickyNodeExists) { - useNodeContextStore.getState().setSelectedStickyId(null) - setShowNodeContext(false) + if (!selectedStickyId || stickyNodeExists) { + return } + + useNodeContextStore.getState().setSelectedStickyId(null) + setShowNodeContext(false) }, [selectedStickyId, stickyNodeExists]) const handleOpenInEditor = useCallback(() => { diff --git a/src/main/frontend/app/routes/studio/xml-to-json-parser.ts b/src/main/frontend/app/routes/studio/xml-to-json-parser.ts index e6acf071..79fcc70f 100644 --- a/src/main/frontend/app/routes/studio/xml-to-json-parser.ts +++ b/src/main/frontend/app/routes/studio/xml-to-json-parser.ts @@ -34,10 +34,10 @@ export type AdapterInfo = { export async function getAdaptersFromConfiguration(projectName: string, filepath: string): Promise { const xmlString = await fetchConfigurationFileCached(projectName, filepath) - const xmlDoc = parseConfigurationXml(xmlString) + const xmlDocument = parseConfigurationXml(xmlString) const adapters: AdapterInfo[] = [] - const adapterElements = xmlDoc.querySelectorAll('Adapter, adapter') + const adapterElements = xmlDocument.querySelectorAll('Adapter, adapter') for (const adapter of adapterElements) { const name = adapter.getAttribute('name') @@ -70,9 +70,9 @@ export async function getAdapterFromConfiguration( adapterPosition?: number, ): Promise { const xmlString = await fetchConfigurationFileCached(projectname, filename) - const xmlDoc = parseConfigurationXml(xmlString) + const xmlDocument = parseConfigurationXml(xmlString) - const adapterList = [...xmlDoc.querySelectorAll('Adapter, adapter')] + const adapterList = [...xmlDocument.querySelectorAll('Adapter, adapter')] if (adapterPosition !== undefined) { return adapterList[adapterPosition] ?? null @@ -175,7 +175,7 @@ function buildNameToNodeMap(nodes: FlowNode[]): Map { * @returns An array of FrankEdge objects representing all generated edges */ function extractEdgesFromAdapter(adapter: Element, nodes: FlowNode[], elementToId: Map): FrankEdge[] { - const pipelineElement = [...adapter.children].find((el) => el.tagName.toLowerCase() === 'pipeline') || null + const pipelineElement = [...adapter.children].find((element) => element.tagName.toLowerCase() === 'pipeline') || null if (!pipelineElement) return [] @@ -348,15 +348,15 @@ function addSequentialFallbackEdges( sourcesWithSuccessExitForward: Set, sourcesWithSuccessPipeForward: Set, ) { - for (let i = 0; i < nodes.length - 1; i++) { - const current = nodes[i] + for (let index = 0; index < nodes.length - 1; index++) { + const current = nodes[index] // skip exit nodes if (current.type === 'exitNode') continue // skip receivers (they already get edges to first pipeline pipe) if (isFrankNode(current) && current.data.type === 'receiver') continue // find next NON-exit node - const next = nodes.slice(i + 1).find((n) => n.type !== 'exitNode') + const next = nodes.slice(index + 1).find((n) => n.type !== 'exitNode') if (!next) continue if (sourcesWithSuccessPipeForward.has(current.id)) continue @@ -419,12 +419,12 @@ function collectPipelineElements(adapter: Element): Element[] { for (const receiver of receiverElements) elements.push(receiver) - const pipelineElement = [...adapter.children].find((el) => el.tagName.toLowerCase() === 'pipeline') || null + const pipelineElement = [...adapter.children].find((element) => element.tagName.toLowerCase() === 'pipeline') || null if (!pipelineElement) return elements const firstPipeName = pipelineElement.getAttribute('firstPipe') - let pipeArray = [...pipelineElement.children] + const pipeArray = [...pipelineElement.children] if (firstPipeName) { const firstPipeIndex = pipeArray.findIndex((pipe) => pipe.getAttribute('name') === firstPipeName) @@ -628,8 +628,8 @@ function extractStickyNotesFromAdapter(adapter: Element, idCounter: IdCounter, f ) for (const note of notes) { - const attrText = note.getAttribute('flow:text') - const text = attrText === null ? (note.textContent ?? '') : attrText + const attributeText = note.getAttribute('flow:text') + const text = attributeText === null ? (note.textContent ?? '') : attributeText const color = note.getAttribute('flow:color') ?? undefined const x = parseNumericAttribute(note.getAttribute('flow:x'), 0) @@ -741,8 +741,8 @@ function assignParentRelationships(flowNodes: FlowNode[], groupNodes: GroupNode[ function parseNumericAttribute(value: string | null, defaultValue: number): number { if (value === null || value.trim() === '') return defaultValue - const num = Number(value) - return Number.isNaN(num) ? defaultValue : num + const number_ = Number(value) + return Number.isNaN(number_) ? defaultValue : number_ } function isSuccessExit(node: FlowNode): boolean { @@ -768,7 +768,7 @@ function isNodeTargeted(nodeId: string, edges: FrankEdge[]): boolean { } function parseElementAttributes( - attrs: NamedNodeMap, + attributes_: NamedNodeMap, defaultWidth: number, defaultHeight: number, skipClassName = false, @@ -779,50 +779,50 @@ function parseElementAttributes( let x = 0 let y = 0 let width = defaultWidth - let height: number | undefined = undefined + let height: number | undefined let hiddenForwards = false - for (const attr of attrs) { - const attrName = attr.name - const value = attr.value + for (const attribute of attributes_) { + const attributeName = attribute.name + const value = attribute.value // Capture name attribute - if (attrName === 'name') { + if (attributeName === 'name') { name = value continue } // Optionally skip className - if (skipClassName && attrName === 'className') continue + if (skipClassName && attributeName === 'className') continue // Flow coordinates - if (attrName === 'flow:x') { + if (attributeName === 'flow:x') { x = parseNumericAttribute(value, 0) continue } - if (attrName === 'flow:y') { + if (attributeName === 'flow:y') { y = parseNumericAttribute(value, 0) continue } // Flow size - if (attrName === 'flow:width') { + if (attributeName === 'flow:width') { width = parseNumericAttribute(value, defaultWidth) continue } - if (attrName === 'flow:height') { + if (attributeName === 'flow:height') { height = parseNumericAttribute(value, defaultHeight) continue } - if (attrName === 'flow:hiddenForwards') { + if (attributeName === 'flow:hiddenForwards') { hiddenForwards = value === 'true' continue } // Store all other attributes - attributes[attrName] = value + attributes[attributeName] = value } return { attributes, name, x, y, width, height, hiddenForwards } diff --git a/src/main/frontend/app/services/configuration-file-service.ts b/src/main/frontend/app/services/configuration-file-service.ts index af01cd39..4a49d37c 100644 --- a/src/main/frontend/app/services/configuration-file-service.ts +++ b/src/main/frontend/app/services/configuration-file-service.ts @@ -41,8 +41,8 @@ export async function saveConfigurationFile( content: string, format = false, ): Promise { - const formatParam = format ? '&format=true' : '' - return apiFetch(`${getBaseUrl(projectName)}?path=${encodeURIComponent(filepath)}${formatParam}`, { + const formatParameter = format ? '&format=true' : '' + return apiFetch(`${getBaseUrl(projectName)}?path=${encodeURIComponent(filepath)}${formatParameter}`, { method: 'PUT', body: content, }) diff --git a/src/main/frontend/app/services/project-service.spec.ts b/src/main/frontend/app/services/project-service.spec.ts index 0432b492..ded64348 100644 --- a/src/main/frontend/app/services/project-service.spec.ts +++ b/src/main/frontend/app/services/project-service.spec.ts @@ -15,8 +15,10 @@ vi.mock('fflate', () => ({ function makeFile(relativePath: string, sizeOverride?: number): File { const file = new File([new Uint8Array(4)], relativePath.split('/').pop() ?? 'file') - Object.defineProperty(file, 'webkitRelativePath', { value: relativePath }) - Object.defineProperty(file, 'arrayBuffer', { value: () => Promise.resolve(new ArrayBuffer(4)) }) + Object.defineProperties(file, { + webkitRelativePath: { value: relativePath }, + arrayBuffer: { value: () => Promise.resolve(new ArrayBuffer(4)) }, + }) if (sizeOverride !== undefined) { Object.defineProperty(file, 'size', { value: sizeOverride }) } diff --git a/src/main/frontend/app/services/project-service.ts b/src/main/frontend/app/services/project-service.ts index 0b8069c8..3d647262 100644 --- a/src/main/frontend/app/services/project-service.ts +++ b/src/main/frontend/app/services/project-service.ts @@ -66,7 +66,7 @@ export async function exportProject(projectName: string): Promise { } export async function importProjectFolder(files: FileList, maxImportBytes: number): Promise { - const projectName = files[0].webkitRelativePath.split('/')[0] + const projectName = files[0].webkitRelativePath.split('/', 1)[0] /* * pre-check on the uncompressed size so an oversized folder fails fast, diff --git a/src/main/frontend/app/stores/git-store.ts b/src/main/frontend/app/stores/git-store.ts index ad05a633..2c513193 100644 --- a/src/main/frontend/app/stores/git-store.ts +++ b/src/main/frontend/app/stores/git-store.ts @@ -69,7 +69,7 @@ export const useGitStore = create((set, get) => ({ const state = get().fileHunkStates[file] if (!state) return const all = new Set() - for (let i = 0; i < state.totalHunks; i++) all.add(i) + for (let index = 0; index < state.totalHunks; index++) all.add(index) set((s) => ({ fileHunkStates: { ...s.fileHunkStates, diff --git a/src/main/frontend/app/stores/node-context-store.ts b/src/main/frontend/app/stores/node-context-store.ts index c0702efc..a4da4e69 100644 --- a/src/main/frontend/app/stores/node-context-store.ts +++ b/src/main/frontend/app/stores/node-context-store.ts @@ -29,7 +29,7 @@ type NodeContextStore = { setChildParentId: (id: string | null) => void setDraggedName: (name: string | null) => void setEditingSubtype: (subtype: string | null) => void - registerSaveFlow: (fn: (() => Promise) | null) => void + registerSaveFlow: (function_: (() => Promise) | null) => void setAllowedOnCanvas: (allowed: boolean) => void setDropSuccessful: (successful: boolean) => void setIsMultiSelect: (value: boolean) => void diff --git a/src/main/frontend/app/stores/tree-store.ts b/src/main/frontend/app/stores/tree-store.ts index 286db783..9a9fea79 100644 --- a/src/main/frontend/app/stores/tree-store.ts +++ b/src/main/frontend/app/stores/tree-store.ts @@ -33,7 +33,7 @@ export const useTreeStore = create((set) => ({ })), removeEditorExpandedItem: (item) => set((state) => ({ - editorExpandedItems: state.editorExpandedItems.filter((i) => i !== item), + editorExpandedItems: state.editorExpandedItems.filter((index) => index !== item), })), studioExpandedItems: [], @@ -43,7 +43,7 @@ export const useTreeStore = create((set) => ({ })), removeStudioExpandedItem: (item) => set((state) => ({ - studioExpandedItems: state.studioExpandedItems.filter((i) => i !== item), + studioExpandedItems: state.studioExpandedItems.filter((index) => index !== item), })), clearExpandedItems: () => set({ editorExpandedItems: [], studioExpandedItems: [] }), diff --git a/src/main/frontend/app/utils/datamapper_utils/conversion-utils.ts b/src/main/frontend/app/utils/datamapper_utils/conversion-utils.ts index caaa981a..56bd3f7d 100644 --- a/src/main/frontend/app/utils/datamapper_utils/conversion-utils.ts +++ b/src/main/frontend/app/utils/datamapper_utils/conversion-utils.ts @@ -32,12 +32,12 @@ function convertNodesToProperty( return nodes .filter((node) => node.parentId === parentId && (node.type === basicNode || isNodeGroup(node.type))) .map((node) => { - let property = nodeToProperty(node as PropertyNode, nodes) + const property = nodeToProperty(node as PropertyNode, nodes) if (isNodeGroup(node.type)) { property.children = convertNodesToProperty(nodes, node.id, basicNode, mappings) } - let targetProperty = property as Target + const targetProperty = property as Target targetProperty.isAttribute = (node.data.isAttribute as boolean) ?? false if (mappings) diff --git a/src/main/frontend/app/utils/datamapper_utils/function-utils.ts b/src/main/frontend/app/utils/datamapper_utils/function-utils.ts index 54d81d55..63ca8b93 100644 --- a/src/main/frontend/app/utils/datamapper_utils/function-utils.ts +++ b/src/main/frontend/app/utils/datamapper_utils/function-utils.ts @@ -2,8 +2,8 @@ import type { Condition, Mutation } from '~/types/datamapper_types/function-type export function generateMutationName(mutation: Mutation) { const inputs = mutation.inputs - .map((i) => { - return i ? i.value : '' + .map((index) => { + return index ? index.value : '' }) .join(', ') @@ -11,8 +11,8 @@ export function generateMutationName(mutation: Mutation) { } export function generateConditionName(condition: Condition) { const inputs = condition.inputs - .map((i) => { - return i ? i.value : '' + .map((index) => { + return index ? index.value : '' }) .join(', ') diff --git a/src/main/frontend/app/utils/datamapper_utils/highlight-utils.ts b/src/main/frontend/app/utils/datamapper_utils/highlight-utils.ts index 0d6bcd0f..169ea274 100644 --- a/src/main/frontend/app/utils/datamapper_utils/highlight-utils.ts +++ b/src/main/frontend/app/utils/datamapper_utils/highlight-utils.ts @@ -5,10 +5,12 @@ export function getHighlightedFromMappingNode(edges: Edge[], id: string): Set() for (const edge of edges) { - if (edge.id.includes(id)) { - highlightedNodes.add(edge.source) - highlightedNodes.add(edge.target) + if (!edge.id.includes(id)) { + continue } + + highlightedNodes.add(edge.source) + highlightedNodes.add(edge.target) } return highlightedNodes diff --git a/src/main/frontend/app/utils/datamapper_utils/property-node-utils.ts b/src/main/frontend/app/utils/datamapper_utils/property-node-utils.ts index 41102e6b..d016944a 100644 --- a/src/main/frontend/app/utils/datamapper_utils/property-node-utils.ts +++ b/src/main/frontend/app/utils/datamapper_utils/property-node-utils.ts @@ -55,7 +55,7 @@ export function getNodesByTypeAndId( ): NodeLabels[] { if (!nodes) return [] - let newNodes = nodes + const newNodes = nodes .filter((node) => { if (!options.typeIncludes) return true @@ -68,7 +68,7 @@ export function getNodesByTypeAndId( if (node.id == options.targetToIncludeOnEdit) return true - return !edges.some((edge) => edge.target === node.id) + return edges.every((edge) => edge.target !== node.id) }) .filter((node) => (options.idIncludes ? node.id.includes(options.idIncludes) : true)) .filter((node) => node.data.isConnectable != false) @@ -79,7 +79,7 @@ export function getNodesByTypeAndId( type: node.data.variableTypeBasic, label: typeof node.data?.label === 'string' ? node.data.label : '', parentArray: recurseFindArray(node, nodes), - ...(options.includeChecked ? { checked: node.data?.checked as boolean } : {}), + ...(options.includeChecked && { checked: node.data?.checked as boolean }), }) as NodeLabels, ) return newNodes @@ -131,7 +131,7 @@ export function updateNodeType(data: CustomNodeData, formatType?: FormatDefiniti export function deleteNodeById( nodes: Node[], idToDelete: string, - sequentialRepositionFn: SequentialRepositionFn, + sequentialRepositionFunction: SequentialRepositionFn, ): { updatedNodes: Node[]; deletedNode?: Node } { const nodeToDelete = nodes.find((node) => node.id === idToDelete) if (!nodeToDelete) return { updatedNodes: nodes } @@ -141,16 +141,16 @@ export function deleteNodeById( if (nodeToDelete.type && isNodeGroup(nodeToDelete.type)) updatedNodes = updatedNodes.filter((node) => !node.parentId?.startsWith(idToDelete)) - if (nodeToDelete.parentId) updatedNodes = sequentialRepositionFn(updatedNodes, nodeToDelete.parentId) + if (nodeToDelete.parentId) updatedNodes = sequentialRepositionFunction(updatedNodes, nodeToDelete.parentId) return { updatedNodes, deletedNode: nodeToDelete } } -export function sequentialReposition(nodes: Node[], startParentId: string, getNodeFunc: GetNodeFunc): Node[] { +export function sequentialReposition(nodes: Node[], startParentId: string, getNodeFunction: GetNodeFunc): Node[] { let parentId: string | null = startParentId while (parentId) { - const parentNode = getNodeFunc(parentId) + const parentNode = getNodeFunction(parentId) //Add the correct initial padding for the first item let yOffset: number = parentNode && parentNode.type && isNodeGroup(parentNode.type) ? GROUP_PADDING_TOP : ITEM_GAP @@ -161,7 +161,7 @@ export function sequentialReposition(nodes: Node[], startParentId: string, getNo for (const child of children) { //Get height of child, or default to standard if it cannot be found - const height: number = getNodeFunc(child.id)?.measured?.height ?? OBJECT_HEIGHT + const height: number = getNodeFunction(child.id)?.measured?.height ?? OBJECT_HEIGHT //Set position of child, because the children objects is a ref to nodes it also updates the values in nodes child.position = { ...child.position, y: yOffset, x: parentNode?.position.x ?? 0 + ITEM_GAP } //Add height and padding to next child height @@ -174,7 +174,7 @@ export function sequentialReposition(nodes: Node[], startParentId: string, getNo * Add padding at the bottom of a group * Move up one */ - parentId = getNodeFunc(parentId)?.parentId ?? null + parentId = getNodeFunction(parentId)?.parentId ?? null } return [...nodes] diff --git a/src/main/frontend/app/utils/datamapper_utils/schema-utils.ts b/src/main/frontend/app/utils/datamapper_utils/schema-utils.ts index a7f6580c..167850ee 100644 --- a/src/main/frontend/app/utils/datamapper_utils/schema-utils.ts +++ b/src/main/frontend/app/utils/datamapper_utils/schema-utils.ts @@ -12,7 +12,7 @@ export async function importJsonSchema( addNode: AddNodeFunction, format: FormatDefinition, ) { - let isRootObject = true + const isRootObject = true async function traverseSchema(object: JsonSchema, parentNodeId: string | null, labelPrefix = '') { if (!object) return @@ -56,11 +56,11 @@ export async function importXsdSchema( const rootElements: XsdElement[] = [] parser.onopentag = (node: { name: string; attributes: SaxAttributes }) => { - const { name: tagName, attributes: attrs } = node + const { name: tagName, attributes: attributes } = node // complexType if (tagName.endsWith('complexType')) { - const typeName = attrs['name'] || '' + const typeName = attributes['name'] || '' const complexType: XsdComplexType = { '@_name': typeName || undefined, 'xs:sequence': undefined } // Attach to current element if unnamed @@ -80,11 +80,11 @@ export async function importXsdSchema( // element if (tagName.endsWith('element')) { const element: XsdElement = { - '@_name': attrs['name'], - '@_type': attrs['type'], - '@_maxOccurs': attrs['maxOccurs'], - '@_minOccurs': attrs['minOccurs'], - '@_default': attrs['default'], + '@_name': attributes['name'], + '@_type': attributes['type'], + '@_maxOccurs': attributes['maxOccurs'], + '@_minOccurs': attributes['minOccurs'], + '@_default': attributes['default'], } if (complexStack.length > 0 && complexStack.at(-1)!['xs:sequence']) { @@ -99,18 +99,20 @@ export async function importXsdSchema( const currentType = complexStack.at(-1)! if (!currentType['xs:attribute']) currentType['xs:attribute'] = [] currentType['xs:attribute'].push({ - '@_name': attrs['name'], - '@_type': attrs['type'], - '@_use': attrs['use'], + '@_name': attributes['name'], + '@_type': attributes['type'], + '@_use': attributes['use'], }) } } parser.onclosetag = (tagName: string) => { - if (tagName.endsWith('complexType') && complexStack.length > 0) { - const completed = complexStack.pop()! - if (completed['@_name']) typeMap.set(completed['@_name'], completed) + if (!(tagName.endsWith('complexType') && complexStack.length > 0)) { + return } + + const completed = complexStack.pop()! + if (completed['@_name']) typeMap.set(completed['@_name'], completed) } parser.write(xmlText).close() @@ -166,8 +168,8 @@ async function addElementNode( nodeId = await addNode(side, name, isArray ? 'array' : 'object', undefined, parentNodeId) await traverseComplexType(element['xs:complexType'], nodeId, side, addNode, format, typeMap, visitedTypes) } else { - const prop = resolveType(side, format, typeName) - nodeId = await addNode(side, name, prop.name, element['@_default'], parentNodeId) + const property = resolveType(side, format, typeName) + nodeId = await addNode(side, name, property.name, element['@_default'], parentNodeId) } return nodeId @@ -185,15 +187,15 @@ async function traverseComplexType( const sequence = type['xs:sequence'] if (sequence?.xs?.element) { const elements: XsdElement[] = Array.isArray(sequence.xs.element) ? sequence.xs.element : [sequence.xs.element] - for (const elem of elements) { - await addElementNode(elem, parentNodeId, side, addNode, format, typeMap, visitedTypes) + for (const element of elements) { + await addElementNode(element, parentNodeId, side, addNode, format, typeMap, visitedTypes) } } if (type['xs:attribute']) { - for (const attr of type['xs:attribute']) { - const prop = resolveType(side, format, attr['@_type']) - await addNode(side, attr['@_name'], prop.name, undefined, parentNodeId, null, true) + for (const attribute of type['xs:attribute']) { + const property = resolveType(side, format, attribute['@_type']) + await addNode(side, attribute['@_name'], property.name, undefined, parentNodeId, null, true) } } } @@ -203,7 +205,7 @@ export async function generateImportButton( fileType: string, side: string, getNode: GetNodeFunc, - importFunc: ImportSchematicFunc, + importFunction: ImportSchematicFunc, ) { const newY = calculateNodePosition(nodes, `${side}-table`, getNode) return { @@ -215,7 +217,7 @@ export async function generateImportButton( data: { fileType, side, - importFunc, + importFunc: importFunction, }, } as Node } diff --git a/src/main/frontend/app/utils/flow-utils.ts b/src/main/frontend/app/utils/flow-utils.ts index 846c6722..43d6aa5f 100644 --- a/src/main/frontend/app/utils/flow-utils.ts +++ b/src/main/frontend/app/utils/flow-utils.ts @@ -8,22 +8,22 @@ export function cloneWithRemappedIds(value: T, idMap: Map, ge } if (value && typeof value === 'object') { - const obj = value as Record + const object = value as Record return Object.fromEntries( - Object.entries(obj).map(([key, val]) => { - if (key === 'id' && typeof val === 'string') { - if (!idMap.has(val)) { - idMap.set(val, generateId()) + Object.entries(object).map(([key, value_]) => { + if (key === 'id' && typeof value_ === 'string') { + if (!idMap.has(value_)) { + idMap.set(value_, generateId()) } - return [key, idMap.get(val)!] + return [key, idMap.get(value_)!] } - if (REFERENCE_KEYS.has(key) && typeof val === 'string') { - return [key, idMap.get(val) ?? val] + if (REFERENCE_KEYS.has(key) && typeof value_ === 'string') { + return [key, idMap.get(value_) ?? value_] } - return [key, cloneWithRemappedIds(val, idMap, generateId)] + return [key, cloneWithRemappedIds(value_, idMap, generateId)] }), ) as T } @@ -137,7 +137,7 @@ export function frankdocChipStyle(name: string): { borderColor: string; backgrou const a = s * Math.min(l, 1 - l) const f = (n: number) => { const k = (n + h / 30) % 12 - return l - a * Math.max(-1, Math.min(k - 3, Math.min(9 - k, 1))) + return l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1)) } const r = Math.round(f(0) * 255) const g = Math.round(f(8) * 255) diff --git a/src/main/frontend/app/utils/xsd-utils.spec.ts b/src/main/frontend/app/utils/xsd-utils.spec.ts index 776e4cfc..eceb2bf5 100644 --- a/src/main/frontend/app/utils/xsd-utils.spec.ts +++ b/src/main/frontend/app/utils/xsd-utils.spec.ts @@ -47,30 +47,30 @@ const XSD = ` ` describe('getAllowedChildElementsForElement', () => { - const doc = parseXsd(XSD) + const document = parseXsd(XSD) it('resolves an element to its complexType via an inline extension base', () => { - expect(resolveElementTypeName(doc, 'SenderPipe')).toBe('SenderPipeType') + expect(resolveElementTypeName(document, 'SenderPipe')).toBe('SenderPipeType') }) it('resolves an element to its complexType via the type attribute', () => { - expect(resolveElementTypeName(doc, 'EchoSender')).toBe('EchoSenderType') + expect(resolveElementTypeName(document, 'EchoSender')).toBe('EchoSenderType') }) it('allows Param on SenderPipe because it is inherited through AbstractPipe', () => { - const allowed = getAllowedChildElementsForElement(doc, 'SenderPipe') + const allowed = getAllowedChildElementsForElement(document, 'SenderPipe') expect(allowed).toContain('Param') expect(allowed).toContain('BooleanParam') expect(allowed).toContain('FixedQuerySender') }) it('does not allow Param on an element that lacks the inherited param group', () => { - const allowed = getAllowedChildElementsForElement(doc, 'EchoSender') + const allowed = getAllowedChildElementsForElement(document, 'EchoSender') expect(allowed).not.toContain('Param') expect(allowed).toContain('Forward') }) it('returns nothing for an unknown element', () => { - expect(getAllowedChildElementsForElement(doc, 'DoesNotExist')).toEqual([]) + expect(getAllowedChildElementsForElement(document, 'DoesNotExist')).toEqual([]) }) }) diff --git a/src/main/frontend/app/utils/xsd-utils.ts b/src/main/frontend/app/utils/xsd-utils.ts index 25c38166..f254f6d9 100644 --- a/src/main/frontend/app/utils/xsd-utils.ts +++ b/src/main/frontend/app/utils/xsd-utils.ts @@ -5,16 +5,16 @@ export function parseXsd(xsdString: string) { return parser.parseFromString(xsdString, 'text/xml') } -export function getChildrenForType(doc: Document, typeName: string): string[] { - const typeNode = getComplexTypeByName(doc, typeName) +export function getChildrenForType(document: Document, typeName: string): string[] { + const typeNode = getComplexTypeByName(document, typeName) if (!typeNode) return [] - return getChildrenFromNode(doc, typeNode) + return getChildrenFromNode(document, typeNode) } function getChildrenFromNode( - doc: Document, + document: Document, node: Element, visitedGroups = new Set(), visitedTypes = new Set(), @@ -22,26 +22,31 @@ function getChildrenFromNode( const results: string[] = [] for (const child of node.children) { - results.push(...handleNode(doc, child, visitedGroups, visitedTypes)) + results.push(...handleNode(document, child, visitedGroups, visitedTypes)) } return results } -function handleNode(doc: Document, node: Element, visitedGroups: Set, visitedTypes: Set): string[] { +function handleNode( + document: Document, + node: Element, + visitedGroups: Set, + visitedTypes: Set, +): string[] { switch (node.localName) { case 'element': { - return handleElement(doc, node, visitedGroups, visitedTypes) + return handleElement(document, node, visitedGroups, visitedTypes) } case 'group': { - return handleGroup(doc, node, visitedGroups, visitedTypes) + return handleGroup(document, node, visitedGroups, visitedTypes) } case 'sequence': case 'choice': case 'all': { - return handleContainer(doc, node, visitedGroups, visitedTypes) + return handleContainer(document, node, visitedGroups, visitedTypes) } default: { @@ -50,7 +55,12 @@ function handleNode(doc: Document, node: Element, visitedGroups: Set, vi } } -function handleElement(doc: Document, node: Element, visitedGroups: Set, visitedTypes: Set): string[] { +function handleElement( + document: Document, + node: Element, + visitedGroups: Set, + visitedTypes: Set, +): string[] { const results: string[] = [] const name = node.getAttribute('name') || node.getAttribute('ref') @@ -61,29 +71,34 @@ function handleElement(doc: Document, node: Element, visitedGroups: Set, if (baseType && !visitedTypes.has(baseType)) { visitedTypes.add(baseType) - const typeNode = getComplexTypeByName(doc, baseType) + const typeNode = getComplexTypeByName(document, baseType) if (typeNode) { - results.push(...getChildrenFromNode(doc, typeNode, visitedGroups, visitedTypes)) + results.push(...getChildrenFromNode(document, typeNode, visitedGroups, visitedTypes)) } } return results } -function handleGroup(doc: Document, node: Element, visitedGroups: Set, visitedTypes: Set): string[] { - const ref = node.getAttribute('ref') - if (!ref || visitedGroups.has(ref)) return [] +function handleGroup( + document: Document, + node: Element, + visitedGroups: Set, + visitedTypes: Set, +): string[] { + const reference = node.getAttribute('ref') + if (!reference || visitedGroups.has(reference)) return [] - visitedGroups.add(ref) + visitedGroups.add(reference) - const groupDef = getGroupByName(doc, ref) + const groupDef = getGroupByName(document, reference) if (!groupDef) return [] - return getChildrenFromNode(doc, groupDef, visitedGroups, visitedTypes) + return getChildrenFromNode(document, groupDef, visitedGroups, visitedTypes) } function handleContainer( - doc: Document, + document: Document, node: Element, visitedGroups: Set, visitedTypes: Set, @@ -91,23 +106,23 @@ function handleContainer( const results: string[] = [] for (const child of node.children) { - results.push(...handleNode(doc, child, visitedGroups, visitedTypes)) + results.push(...handleNode(document, child, visitedGroups, visitedTypes)) } return results } -function getComplexTypeByName(doc: Document, typeName: string): Element | null { - return queryOne(doc, `//xs:complexType[@name='${typeName}']`) +function getComplexTypeByName(document: Document, typeName: string): Element | null { + return queryOne(document, `//xs:complexType[@name='${typeName}']`) } -function getGroupByName(doc: Document, name: string): Element | null { - return queryOne(doc, `//xs:group[@name='${name}']`) +function getGroupByName(document: Document, name: string): Element | null { + return queryOne(document, `//xs:group[@name='${name}']`) } function getBaseTypeFromElement(element: Element): string | null { - const ext = queryOne(element, `.//xs:extension`) - return ext?.getAttribute('base') || null + const extension = queryOne(element, `.//xs:extension`) + return extension?.getAttribute('base') || null } const nsResolver = (prefix: string | null) => (prefix === 'xs' ? 'http://www.w3.org/2001/XMLSchema' : null) @@ -122,27 +137,27 @@ function evaluateXPath( xpath: string, type: number = XPathResult.FIRST_ORDERED_NODE_TYPE, ): XPathResult { - const doc = context.ownerDocument ?? context + const document = context.ownerDocument ?? context - return doc.evaluate(xpath, context, nsResolver, type, null) + return document.evaluate(xpath, context, nsResolver, type, null) } -export function resolveElementTypeName(doc: Document, elementName: string): string | null { - const elementNode = queryOne(doc, `//xs:element[@name='${elementName}']`) +export function resolveElementTypeName(document: Document, elementName: string): string | null { + const elementNode = queryOne(document, `//xs:element[@name='${elementName}']`) if (!elementNode) return null return elementNode.getAttribute('type') ?? getBaseTypeFromElement(elementNode) ?? `${elementName}Type` } -export function getAllowedChildElementsForElement(doc: Document, elementName: string): string[] { - const typeName = resolveElementTypeName(doc, elementName) +export function getAllowedChildElementsForElement(document: Document, elementName: string): string[] { + const typeName = resolveElementTypeName(document, elementName) if (!typeName) return [] - return getFirstLevelElementsForType(doc, typeName) + return getFirstLevelElementsForType(document, typeName) } -export function getFirstLevelElementsForType(doc: Document, typeName: string): string[] { - const typeNode = getComplexTypeByName(doc, typeName) +export function getFirstLevelElementsForType(document: Document, typeName: string): string[] { + const typeNode = getComplexTypeByName(document, typeName) if (!typeNode) return [] const results = new Set() @@ -160,12 +175,12 @@ export function getFirstLevelElementsForType(doc: Document, typeName: string): s } case 'group': { - const ref = child.getAttribute('ref') - if (!ref || visitedGroups.has(ref)) break + const reference = child.getAttribute('ref') + if (!reference || visitedGroups.has(reference)) break - visitedGroups.add(ref) + visitedGroups.add(reference) - const groupDef = getGroupByName(doc, ref) + const groupDef = getGroupByName(document, reference) if (!groupDef) break extract(groupDef, visitedGroups) @@ -188,21 +203,21 @@ export function getFirstLevelElementsForType(doc: Document, typeName: string): s return [...results] } -export function getElementRequirements(doc: Document, elementName: string): Requirement[] { - const typeName = resolveElementTypeName(doc, elementName) +export function getElementRequirements(document: Document, elementName: string): Requirement[] { + const typeName = resolveElementTypeName(document, elementName) if (!typeName) return [] - const typeNode = getComplexTypeByName(doc, typeName) + const typeNode = getComplexTypeByName(document, typeName) if (!typeNode) { console.warn(`No type found for element "${elementName}" (tried "${typeName}")`) return [] } - return extractRequirements(doc, typeNode) + return extractRequirements(document, typeNode) } function extractRequirements( - doc: Document, + document: Document, node: Element, parentRequired = true, visitedGroups = new Set(), @@ -227,15 +242,15 @@ function extractRequirements( } case 'group': { - const ref = child.getAttribute('ref') - if (!ref || visitedGroups.has(ref)) break + const reference = child.getAttribute('ref') + if (!reference || visitedGroups.has(reference)) break - visitedGroups.add(ref) + visitedGroups.add(reference) - const groupDef = getGroupByName(doc, ref) + const groupDef = getGroupByName(document, reference) if (!groupDef) break - const children = extractRequirements(doc, groupDef, isRequired, visitedGroups) + const children = extractRequirements(document, groupDef, isRequired, visitedGroups) if (isRequired) { // REQUIRED GROUP = "at least one of its children" @@ -254,7 +269,7 @@ function extractRequirements( case 'sequence': case 'all': { - const children = extractRequirements(doc, child, isRequired, visitedGroups) + const children = extractRequirements(document, child, isRequired, visitedGroups) results.push({ kind: 'group', @@ -266,7 +281,7 @@ function extractRequirements( } case 'choice': { - const children = extractRequirements(doc, child, isRequired, visitedGroups) + const children = extractRequirements(document, child, isRequired, visitedGroups) results.push({ kind: 'group', @@ -295,11 +310,11 @@ function evaluateRequirement(requirement: Requirement, children: ChildNode[]): b if (requirement.kind === 'group') { if (requirement.mode === 'all') { - return requirement.children.every((childReq) => evaluateRequirement(childReq, children)) + return requirement.children.every((childRequest) => evaluateRequirement(childRequest, children)) } if (requirement.mode === 'one') { - return requirement.children.some((childReq) => evaluateRequirement(childReq, children)) + return requirement.children.some((childRequest) => evaluateRequirement(childRequest, children)) } } @@ -309,8 +324,8 @@ function evaluateRequirement(requirement: Requirement, children: ChildNode[]): b export function getMissingRequirements(requirements: Requirement[], children: ChildNode[]): string[] { const missing: string[] = [] - for (const req of requirements) { - collectMissing(req, children, missing) + for (const request of requirements) { + collectMissing(request, children, missing) } return missing From 1200f81657ea73ac6ec242858cc2e03444808960 Mon Sep 17 00:00:00 2001 From: Vivy <4380412+Matthbo@users.noreply.github.com> Date: Fri, 17 Jul 2026 17:17:42 +0200 Subject: [PATCH 3/6] Apply linting --- .../frontend/app/actions/navigationActions.ts | 8 +- .../app/components/context-editor-footer.tsx | 2 +- .../basic-components/close-button.tsx | 4 +- .../basic-components/delete-button.tsx | 4 +- .../basic-components/edit-button.tsx | 4 +- .../basic-components/generate-button.tsx | 4 +- .../basic-components/highlight-button.tsx | 10 +- .../basic-components/hover-info.tsx | 2 +- .../basic-components/import-button.tsx | 6 +- .../basic-components/variable-type-icon.tsx | 5 +- .../datamapper/forms/add-conditions-form.tsx | 60 +- .../datamapper/forms/add-field-form.tsx | 32 +- .../datamapper/forms/add-mapping-form.tsx | 113 +- .../datamapper/forms/add-mutation-form.tsx | 97 +- .../react-flow/array-group-node.tsx | 22 +- .../react-flow/array-mapping-node.tsx | 6 +- .../react-flow/extra-source-node.tsx | 6 +- .../react-flow/import-schematic-node.tsx | 10 +- .../react-flow/labeled-group-node.tsx | 8 +- .../datamapper/react-flow/mapping-node.tsx | 8 +- .../datamapper/react-flow/node-types.tsx | 58 +- .../datamapper/react-flow/one-edge-node.tsx | 25 +- src/main/frontend/app/components/dialog.tsx | 10 +- .../directory-picker/directory-picker.tsx | 39 +- .../base-files-data-provider.ts | 42 +- .../file-structure/confirm-delete-dialog.tsx | 15 +- .../file-structure/context-menu.tsx | 10 +- .../file-structure/editor-data-provider.ts | 105 +- .../file-structure/editor-file-structure.tsx | 141 +- .../file-structure/file-tree-dialogs.tsx | 3 +- .../file-structure/inline-rename-input.tsx | 10 +- .../file-structure/name-input-dialog.tsx | 12 +- .../file-structure/studio-context-menu.tsx | 12 +- .../file-structure/studio-file-structure.tsx | 124 +- .../studio-file-tree-dialogs.tsx | 2 +- .../studio-files-data-provider.ts | 76 +- .../file-structure/tree-utilities.ts | 14 +- .../use-file-tree-context-menu.ts | 36 +- .../file-structure/use-studio-context-menu.ts | 41 +- .../flow/add-subcomponent-modal.tsx | 30 +- .../components/flow/canvas-context-menu.tsx | 6 +- .../app/components/flow/create-node-modal.tsx | 53 +- .../app/components/git/diff-tab-view.tsx | 42 +- .../app/components/git/git-changes.tsx | 19 +- .../app/components/git/git-commit-box.tsx | 6 +- .../frontend/app/components/git/git-panel.tsx | 24 +- .../app/components/git/git-toolbar.tsx | 10 +- .../components/inputs/active-icon-button.tsx | 7 +- .../frontend/app/components/inputs/button.tsx | 6 +- .../components/inputs/checkbox-with-label.tsx | 7 +- .../app/components/inputs/checkbox.tsx | 8 +- .../app/components/inputs/close-button.tsx | 2 +- .../app/components/inputs/dropdown.tsx | 56 +- .../app/components/inputs/icon-button.tsx | 6 +- .../components/inputs/icon-label-button.tsx | 7 +- .../components/inputs/input-with-label.tsx | 2 +- .../frontend/app/components/inputs/input.tsx | 2 +- .../app/components/inputs/kebab-menu.tsx | 16 +- .../app/components/inputs/link-button.tsx | 4 +- .../app/components/inputs/radio-button.tsx | 6 +- .../app/components/inputs/radio-list.tsx | 10 +- .../app/components/inputs/rounded-toggle.tsx | 2 +- .../components/inputs/segmented-button.tsx | 2 +- .../app/components/inputs/switch-toggle.tsx | 4 +- .../frontend/app/components/inputs/toggle.tsx | 6 +- .../components/inputs/tree-action-button.tsx | 4 +- .../app/components/inputs/validatedInput.tsx | 12 +- .../frontend/app/components/load-error.tsx | 2 +- .../app/components/loading-spinner.tsx | 6 +- src/main/frontend/app/components/modal.tsx | 4 +- .../app/components/navbar/navbar-link.tsx | 4 +- .../frontend/app/components/navbar/navbar.tsx | 2 +- .../app/components/save-status-indicator.tsx | 12 +- .../frontend/app/components/search/search.tsx | 2 +- .../sidebars-layout/sidebar-close.tsx | 6 +- .../sidebars-layout/sidebar-content-close.tsx | 5 +- .../sidebars-layout/sidebar-header.tsx | 2 +- .../sidebars-layout/sidebar-layout-store.ts | 61 +- .../sidebars-layout/sidebar-layout.tsx | 34 +- .../app/components/tabs/editor-tabs.tsx | 23 +- .../app/components/tabs/studio-tabs.tsx | 23 +- src/main/frontend/app/components/tabs/tab.tsx | 11 +- .../frontend/app/components/tabs/tabs.tsx | 21 +- src/main/frontend/app/components/toast.tsx | 24 +- src/main/frontend/app/hooks/use-async.ts | 16 +- .../app/hooks/use-context-menu-dismiss.ts | 10 +- .../hooks/use-datamapper-flow-management.ts | 147 +- .../frontend/app/hooks/use-file-watcher.ts | 14 +- .../frontend/app/hooks/use-handle-types.ts | 4 +- src/main/frontend/app/hooks/use-projects.ts | 8 +- .../app/hooks/use-shortcut-listener.ts | 14 +- src/main/frontend/app/hooks/use-shortcut.ts | 8 +- .../frontend/app/hooks/use-submit-on-enter.ts | 8 +- src/main/frontend/app/hooks/use-theme.ts | 8 +- src/main/frontend/app/main.tsx | 10 +- .../providers/frankconfig-xsd-provider.tsx | 10 +- src/main/frontend/app/router.tsx | 2 +- src/main/frontend/app/routes/app-layout.tsx | 16 +- .../routes/configurations/adapter-context.tsx | 12 +- .../configurations/adapter-list-item.tsx | 4 +- .../add-configuration-file-modal.tsx | 26 +- .../add-configuration-file-tile.tsx | 2 +- .../add-non-canvas-component-menu.tsx | 25 +- .../configurations/component-list-item.tsx | 5 +- .../routes/configurations/component-row.tsx | 5 +- .../configuration-file-tile.tsx | 30 +- .../configurations/configuration-overview.tsx | 125 +- .../non-canvas-component-context.tsx | 42 +- .../non-canvas-component-palette.tsx | 27 +- .../use-non-canvas-components.ts | 31 +- .../app/routes/datamapper/initialize.tsx | 19 +- .../app/routes/datamapper/mapping-table.tsx | 32 +- .../app/routes/datamapper/property-list.tsx | 374 +- .../frontend/app/routes/datamapper/root.tsx | 22 +- .../frontend/app/routes/editor/editor.tsx | 314 +- .../frontend/app/routes/editor/xml-utils.ts | 26 +- .../frontend/app/routes/help/help-image.tsx | 7 +- .../frontend/app/routes/help/help-topics.tsx | 16 +- src/main/frontend/app/routes/help/help.tsx | 2 +- .../app/routes/help/keybinds-table.tsx | 14 +- .../app/routes/notfound/not-found.test.tsx | 30 +- .../app/routes/notfound/not-found.tsx | 4 +- .../routes/projectlanding/action-button.tsx | 6 +- .../clone-configuration-modal.tsx | 22 +- .../projectlanding/configuration-row.tsx | 2 +- .../new-configuration-modal.tsx | 24 +- .../routes/projectlanding/project-landing.tsx | 83 +- .../routes/projectlanding/project-list.tsx | 12 +- .../app/routes/projectlanding/sidebar.tsx | 2 +- .../app/routes/projectlanding/toolbar.tsx | 4 +- .../settings/pages/general-settings.tsx | 10 +- .../settings/pages/project-settings.tsx | 12 +- .../routes/settings/pages/studio-settings.tsx | 6 +- .../app/routes/settings/settings-menu.tsx | 19 +- .../frontend/app/routes/settings/settings.tsx | 4 +- .../studio/canvas/edgetypes/edge-label.tsx | 2 +- .../studio/canvas/edgetypes/frank-edge.tsx | 32 +- .../canvas/node-context-menu-context.ts | 4 +- .../studio/canvas/nodetypes/child-node.tsx | 26 +- .../components/deprecated-popover.tsx | 2 +- .../nodetypes/components/handle-menu-item.tsx | 2 +- .../nodetypes/components/handle-menu.tsx | 16 +- .../canvas/nodetypes/components/handle.tsx | 8 +- .../components/missing-requirements.tsx | 17 +- .../components/node-children-container.tsx | 2 +- .../nodetypes/components/node-header.tsx | 2 +- .../studio/canvas/nodetypes/exit-node.tsx | 8 +- .../studio/canvas/nodetypes/frank-node.tsx | 230 +- .../studio/canvas/nodetypes/group-node.tsx | 6 +- .../studio/canvas/nodetypes/start-node.tsx | 2 +- .../studio/canvas/nodetypes/sticky-note.tsx | 18 +- .../canvas/nodetypes/zoomed-out-node.tsx | 7 +- .../studio/context/context-input-field.tsx | 10 +- .../routes/studio/context/context-input.tsx | 17 +- .../context/deprecated-list-popover.tsx | 8 +- .../studio/context/element-hover-card.tsx | 18 +- .../routes/studio/context/group-context.tsx | 23 +- .../routes/studio/context/node-context.tsx | 116 +- .../routes/studio/context/sorted-elements.tsx | 43 +- .../studio/context/sticky-note-context.tsx | 22 +- .../routes/studio/context/studio-context.tsx | 68 +- .../app/routes/studio/flow-to-xml-parser.ts | 72 +- .../routes/studio/node-translator-module.ts | 2 +- .../frontend/app/routes/studio/studio.tsx | 87 +- .../app/routes/studio/xml-to-json-parser.ts | 114 +- .../services/configuration-file-service.ts | 2 +- .../services/non-canvas-component-service.ts | 12 +- .../app/services/project-service.spec.ts | 12 +- .../frontend/app/services/project-service.ts | 4 +- .../frontend/app/stores/child-utilities.ts | 8 +- .../frontend/app/stores/editor-tab-store.ts | 107 +- src/main/frontend/app/stores/flow-store.ts | 1059 ++--- src/main/frontend/app/stores/git-store.ts | 209 +- .../frontend/app/stores/node-context-store.ts | 121 +- src/main/frontend/app/stores/project-store.ts | 44 +- .../frontend/app/stores/save-status-store.ts | 16 +- .../frontend/app/stores/settings-store.ts | 155 +- .../frontend/app/stores/shortcut-store.ts | 32 +- src/main/frontend/app/stores/tab-store.ts | 154 +- src/main/frontend/app/stores/tree-store.ts | 79 +- src/main/frontend/app/utils/api.ts | 8 +- .../canvas-management-utils.ts | 4 +- .../datamapper_utils/conversion-utils.ts | 32 +- .../utils/datamapper_utils/function-utils.ts | 8 +- .../datamapper_utils/generic-node-utils.ts | 14 +- .../utils/datamapper_utils/highlight-utils.ts | 3732 ++++++++++++++++- .../datamapper_utils/mapping-node-utils.ts | 85 +- .../datamapper_utils/property-node-utils.ts | 48 +- .../utils/datamapper_utils/schema-utils.ts | 26 +- .../app/utils/edge-label-utils.spec.ts | 11 +- .../frontend/app/utils/edge-label-utils.ts | 5 +- .../frontend/app/utils/flow-utils.spec.ts | 14 +- src/main/frontend/app/utils/flow-utils.ts | 24 +- src/main/frontend/app/utils/monaco-setup.ts | 3 +- src/main/frontend/app/utils/xsd-utils.ts | 39 +- src/main/frontend/eslint.config.mjs | 1 + 196 files changed, 7719 insertions(+), 2795 deletions(-) diff --git a/src/main/frontend/app/actions/navigationActions.ts b/src/main/frontend/app/actions/navigationActions.ts index 33645768..26e0c147 100644 --- a/src/main/frontend/app/actions/navigationActions.ts +++ b/src/main/frontend/app/actions/navigationActions.ts @@ -6,7 +6,7 @@ import { getBaseName } from '~/utils/path-utils' export function openInStudio( navigate: NavigateFunction, { adapterName, filepath, adapterPosition }: { adapterName: string; filepath: string; adapterPosition: number }, -) { +): void { const { setTabData, setActiveTab, getTab } = useTabStore.getState() const tabId = `${filepath}::${adapterName}::${adapterPosition}` @@ -28,7 +28,7 @@ export function openInStudio( navigate('/studio') } -export function openInEditor(relativePath: string, filepath: string, navigate: NavigateFunction) { +export function openInEditor(relativePath: string, filepath: string, navigate: NavigateFunction): void { const { setTabData, setActiveTab, getTab } = useEditorTabStore.getState() if (!getTab(filepath)) { @@ -45,7 +45,7 @@ export function openInEditor(relativePath: string, filepath: string, navigate: N export function openInEditorAtElement( navigate: NavigateFunction, { subtype, filepath, name }: { subtype: string; filepath: string; name?: string }, -) { +): void { const editorStore = useEditorTabStore.getState() const fileName = getBaseName(filepath) @@ -76,7 +76,7 @@ export function openInStudioAtNode( subtype: string name: string }, -) { +): void { const { setTabData, setActiveTab, getTab } = useTabStore.getState() const tabId = `${filepath}::${adapterName}::${adapterPosition}` diff --git a/src/main/frontend/app/components/context-editor-footer.tsx b/src/main/frontend/app/components/context-editor-footer.tsx index e703ce23..ce314e1d 100644 --- a/src/main/frontend/app/components/context-editor-footer.tsx +++ b/src/main/frontend/app/components/context-editor-footer.tsx @@ -21,7 +21,7 @@ export default function ContextEditorFooter({ deleteLabel = 'Delete', errorMessage, leadingActions, -}: Readonly) { +}: Readonly): JSX.Element { return (
diff --git a/src/main/frontend/app/components/datamapper/basic-components/close-button.tsx b/src/main/frontend/app/components/datamapper/basic-components/close-button.tsx index d85a613d..5fe39940 100644 --- a/src/main/frontend/app/components/datamapper/basic-components/close-button.tsx +++ b/src/main/frontend/app/components/datamapper/basic-components/close-button.tsx @@ -1,13 +1,13 @@ import clsx from 'clsx' -export default function CloseButton({ onClick, className }: { onClick: () => void; className?: string }) { +export default function CloseButton({ onClick, className }: { onClick: () => void; className?: string }): JSX.Element { return (
@@ -106,9 +116,9 @@ function ConditionDetailsForm({ setCondition: React.Dispatch> sources: Source[] conditionConfig: ConditionType -}>) { - function updateInput(index: number, value: ConditionInput) { - setCondition((condition) => { +}>): JSX.Element { + function updateInput(index: number, value: ConditionInput): void { + setCondition((condition): { inputs: ConditionInput[]; id: string; name: string; type: ConditionType | null } => { const newInputs = [...condition.inputs] newInputs[index] = value return { ...condition, inputs: newInputs } @@ -117,12 +127,12 @@ function ConditionDetailsForm({ return (
- {conditionConfig.inputs.map((inputConfig, index) => ( + {conditionConfig.inputs.map((inputConfig, index): JSX.Element => ( updateInput(index, value)} + onChange={(value): void => updateInput(index, value)} sources={sources} /> ))} @@ -140,20 +150,20 @@ function ConditionInputField({ value?: ConditionInput onChange: (value_: ConditionInput) => void sources: Source[] -}>) { +}>): JSX.Element { let filteredSources = sources if (inputConfig.inputsAllowed !== 'all') { - filteredSources = sources.filter((source) => source.type === inputConfig.inputsAllowed) + filteredSources = sources.filter((source): boolean => source.type === inputConfig.inputsAllowed) } if (inputConfig.type === 'source') { const selectedIsDefault = value?.type === 'defaultValue' - function handleSourceChange(sourceId: string) { + function handleSourceChange(sourceId: string): void { if (sourceId === 'defaultValue') { onChange({ type: 'defaultValue', value: '' }) return } - const source = sources.find((source) => source.id === sourceId) + const source = sources.find((source): boolean => source.id === sourceId) if (!source) return onChange({ type: 'source', sourceId: sourceId, value: source.label }) } @@ -167,7 +177,7 @@ function ConditionInputField({ onChange={handleSourceChange} options={Object.fromEntries([ ...(inputConfig.allowDefaultValue ? [['defaultValue', 'Default Value']] : []), - ...filteredSources.map((source) => [source.id, source.label]), + ...filteredSources.map((source): string[] => [source.id, source.label]), ])} /> @@ -176,7 +186,7 @@ function ConditionInputField({ type="text" placeholder="Enter default value" value={value?.value ?? ''} - onChange={(event) => onChange({ type: 'defaultValue', value: event.target.value })} + onChange={(event): void => onChange({ type: 'defaultValue', value: event.target.value })} /> )}
@@ -190,7 +200,7 @@ function ConditionInputField({ onChange({ type: 'attribute', value: event.target.value })} + onChange={(event): void => onChange({ type: 'attribute', value: event.target.value })} />
) @@ -211,8 +221,8 @@ function ConditionInputField({ onChange({ type: 'operator', value: value_ })} - options={Object.fromEntries(operatorConfig.allowedValues.map((option) => [option, option]))} + onChange={(value_): void => onChange({ type: 'operator', value: value_ })} + options={Object.fromEntries(operatorConfig.allowedValues.map((option): [string, string] => [option, option]))} />
) @@ -225,7 +235,7 @@ function ConditionInputField({ onChange({ type: 'defaultValue', value: event.target.value })} + onChange={(event): void => onChange({ type: 'defaultValue', value: event.target.value })} />
) diff --git a/src/main/frontend/app/components/datamapper/forms/add-field-form.tsx b/src/main/frontend/app/components/datamapper/forms/add-field-form.tsx index da06bdd8..e05f84ab 100644 --- a/src/main/frontend/app/components/datamapper/forms/add-field-form.tsx +++ b/src/main/frontend/app/components/datamapper/forms/add-field-form.tsx @@ -21,7 +21,13 @@ export type FieldModalProperties = { initialData: CustomNodeData | null } -function AddFieldForm({ fieldType, onSave, parents, formatDefinition, initialData }: FieldModalProperties) { +function AddFieldForm({ + fieldType, + onSave, + parents, + formatDefinition, + initialData, +}: FieldModalProperties): JSX.Element { const [variableType, setVariableType] = useState(initialData?.variableType || '') const [label, setLabel] = useState(initialData?.label || '') const [defaultValue, setDefaultValue] = useState(initialData?.defaultValue || '') @@ -31,23 +37,23 @@ function AddFieldForm({ fieldType, onSave, parents, formatDefinition, initialDat const [availableTypes, setAvailableTypes] = useState([]) const [isAttribute, setIsAttribute] = useState(initialData?.isAttribute || false) - useEffect(() => { + useEffect((): void => { const format: FormatDefinition | null = formatDefinition[fieldType] if (format) { setAvailableTypes(format.properties) } }, [formatDefinition, fieldType]) - useEffect(() => { + useEffect((): void => { const format = formatDefinition[fieldType] - const propertyRules = format?.properties.find((a) => a.name == variableType) + const propertyRules = format?.properties.find((a): boolean => a.name == variableType) setDefaultValueRules(propertyRules?.rules) setDefaultValueInputType(propertyRules?.type) }, [fieldType, formatDefinition, variableType]) const isFormIncomplete = !variableType || !label || !parentId - function handleSave() { + function handleSave(): void { if (isFormIncomplete) { showWarningToast('Please fill in all fields!', 'Invalid input') return @@ -62,7 +68,7 @@ function AddFieldForm({ fieldType, onSave, parents, formatDefinition, initialDat }) } - function validateDefaultValue(value: string) { + function validateDefaultValue(value: string): void { if (defaultValueInputType !== 'number') { setDefaultValue(value) return @@ -112,9 +118,9 @@ function AddFieldForm({ fieldType, onSave, parents, formatDefinition, initialDat className="max-w-55" id="parentId" value={parentId} - onChange={(e) => setParent(e)} + onChange={(e): void => setParent(e)} options={{ - ...Object.fromEntries(parents.map((p) => [p.id, p.label])), + ...Object.fromEntries(parents.map((p): [string, string] => [p.id, p.label])), }} /> @@ -125,13 +131,13 @@ function AddFieldForm({ fieldType, onSave, parents, formatDefinition, initialDat className="max-w-55" id="variableType" value={variableType} - onChange={(value) => setVariableType(value)} + onChange={(value): void => setVariableType(value)} disabled={initialData?.variableType == 'object'} - options={Object.fromEntries(availableTypes.map((p) => [p.name, p.name]))} + options={Object.fromEntries(availableTypes.map((p): [string, string] => [p.name, p.name]))} /> - setLabel(event.target.value)} /> + setLabel(event.target.value)} /> diff --git a/src/main/frontend/app/components/datamapper/forms/add-mapping-form.tsx b/src/main/frontend/app/components/datamapper/forms/add-mapping-form.tsx index 0fa295ac..9d4b7708 100644 --- a/src/main/frontend/app/components/datamapper/forms/add-mapping-form.tsx +++ b/src/main/frontend/app/components/datamapper/forms/add-mapping-form.tsx @@ -19,19 +19,19 @@ export type MappingModalProps = { initialData: MappingNodeData | null } -const updateArrayItem = (setter: Dispatch>, index: number, value: T) => { - setter((previous) => { +const updateArrayItem = (setter: Dispatch>, index: number, value: T): void => { + setter((previous): T[] => { const next = [...previous] if (index >= 0 && index < next.length) next[index] = value return next }) } -const deleteArrayItem = (setter: Dispatch>, index: number) => { - setter((previous) => previous.filter((_, index_) => index_ !== index)) +const deleteArrayItem = (setter: Dispatch>, index: number): void => { + setter((previous): T[] => previous.filter((_, index_): boolean => index_ !== index)) } -function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalProps) { +function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalProps): React.JSX.Element { const [sourceIds, setSourceIds] = useState([]) const [targetId, setTargetId] = useState('') @@ -49,15 +49,15 @@ function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalP const [isConditional, setIsConditional] = useState(!!initialData?.conditional) const [selectedConditional, setSelectedConditional] = useState(initialData?.conditional ?? null) - const unfilteredOutputs: Source[] = useMemo(() => { + const unfilteredOutputs: Source[] = useMemo((): Source[] => { return [ - ...sources.filter((source) => sourceIds.includes(source.id)), - ...mutations.map((mutation) => ({ + ...sources.filter((source): boolean => sourceIds.includes(source.id)), + ...mutations.map((mutation): { id: string; label: string; type: string | undefined } => ({ id: mutation.id, label: mutation.name, type: mutation.mutationType?.outputType, })), - ...conditions.map((condition) => ({ + ...conditions.map((condition): { id: string; label: string; type: string } => ({ id: condition.id, label: condition.name, type: 'boolean', @@ -65,17 +65,17 @@ function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalP ] as Source[] }, [sources, sourceIds, mutations, conditions]) - const filteredOutputs = React.useMemo(() => { + const filteredOutputs = React.useMemo((): Source[] => { if (!targetId) return [] - const outputType = targets.find((target) => target.id === targetId)?.type + const outputType = targets.find((target): boolean => target.id === targetId)?.type if (!outputType) return [] - return unfilteredOutputs.filter((output) => output.type === outputType) + return unfilteredOutputs.filter((output): boolean => output.type === outputType) }, [targetId, targets, unfilteredOutputs]) - useEffect(() => { - const outputType = targets.find((target) => target.id === targetId)?.type + useEffect((): void => { + const outputType = targets.find((target): boolean => target.id === targetId)?.type const possibleOutputs = unfilteredOutputs.some( - (possibleOutput) => possibleOutput.id === output && possibleOutput.type === outputType, + (possibleOutput): boolean => possibleOutput.id === output && possibleOutput.type === outputType, ) if (!possibleOutputs) { setOutput('') @@ -86,7 +86,7 @@ function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalP } }, [targetId, filteredOutputs, unfilteredOutputs, output, targets]) - useEffect(() => { + useEffect((): void => { if (initialData) { setSourceIds(initialData.sources) setTargetId(initialData.target ?? '') @@ -94,18 +94,20 @@ function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalP setConditions(initialData.conditions || []) setOutput(initialData.output) } else { - const selectedSources = sources.filter((source) => source.checked).map((source) => source.id) - const selectedTarget = targets.find((target) => target.checked)?.id ?? '' + const selectedSources = sources + .filter((source): boolean | undefined => source.checked) + .map((source): string => source.id) + const selectedTarget = targets.find((target): boolean | undefined => target.checked)?.id ?? '' setSourceIds(selectedSources.length > 0 ? selectedSources : []) setTargetId(selectedTarget) } }, [sources, targets, initialData]) - const handleSave = () => { + const handleSave = (): void => { onSave({ id: initialData?.id, - outputLabel: unfilteredOutputs.find((unfilteredOutput) => unfilteredOutput.id === output)?.label, + outputLabel: unfilteredOutputs.find((unfilteredOutput): boolean => unfilteredOutput.id === output)?.label, colour: initialData?.colour, sources: sourceIds, target: targetId, @@ -117,7 +119,7 @@ function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalP }) } - const isFormIncomplete = sourceIds.some((id) => !id) || !targetId || !output + const isFormIncomplete = sourceIds.some((id): boolean => !id) || !targetId || !output const scrollable = 'flex-1 min-h-0 overflow-y-auto space-y-2 max-w-55 truncate' @@ -133,23 +135,26 @@ function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalP
- {sourceIds.map((id, value) => ( + {sourceIds.map((id, value): React.JSX.Element => (
updateArrayItem(setSourceIds, value, event)} + onChange={(event): void => updateArrayItem(setSourceIds, value, event)} options={Object.fromEntries( - sources.map((source) => [source.id, `${source.label} (${source.type})`]), + sources.map((source): [string, string] => [source.id, `${source.label} (${source.type})`]), )} /> - deleteArrayItem(setSourceIds, value)} /> + deleteArrayItem(setSourceIds, value)} />
))}
-
@@ -161,21 +166,21 @@ function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalP
- {mutations.map((mutation) => ( + {mutations.map((mutation): React.JSX.Element => (
{mutation.name}
{ + onClick={(): void => { setEditMutation(mutation) setMutationModal(true) }} /> - setMutations((mutations) => - mutations.filter((mutationIterator) => mutationIterator.id !== mutation.id), + onClick={(): void => + setMutations((mutations): Mutation[] => + mutations.filter((mutationIterator): boolean => mutationIterator.id !== mutation.id), ) } /> @@ -185,7 +190,7 @@ function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalP ))}
-
@@ -194,21 +199,21 @@ function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalP
- {conditions.map((condition) => ( + {conditions.map((condition): React.JSX.Element => (
{condition.name}
{ + onClick={(): void => { setEditCondition(condition) setConditionModal(true) }} /> - setConditions((conditions) => - conditions.filter((conditionToCompare) => conditionToCompare.id !== condition.id), + onClick={(): void => + setConditions((conditions): Condition[] => + conditions.filter((conditionToCompare): boolean => conditionToCompare.id !== condition.id), ) } /> @@ -218,7 +223,7 @@ function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalP ))}
-
@@ -234,7 +239,7 @@ function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalP value={output} onChange={setOutput} options={Object.fromEntries( - filteredOutputs.map((output) => [output.id, `${output.label} (${output.type})`]), + filteredOutputs.map((output): [string, string] => [output.id, `${output.label} (${output.type})`]), )} />
@@ -248,7 +253,9 @@ function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalP className="max-w-50" value={targetId} onChange={setTargetId} - options={Object.fromEntries(targets.map((target) => [target.id, `${target.label} (${target.type})`]))} + options={Object.fromEntries( + targets.map((target): [string, string] => [target.id, `${target.label} (${target.type})`]), + )} />
@@ -256,7 +263,7 @@ function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalP {/* Conditional Mapping */}
@@ -264,8 +271,12 @@ function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalP setSelectedConditional(conditions.find((condition) => condition.id === e) ?? null)} - options={Object.fromEntries(conditions.map((condition) => [condition.id, condition.name]))} + onChange={(e): void => + setSelectedConditional(conditions.find((condition): boolean => condition.id === e) ?? null) + } + options={Object.fromEntries( + conditions.map((condition): [string, string] => [condition.id, condition.name]), + )} /> )}
@@ -279,14 +290,14 @@ function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalP {/* Modals */} - setMutationModal(false)}> + setMutationModal(false)}> { - setMutations((mutations) => + onSave={(mutationToEdit): void => { + setMutations((mutations): Mutation[] => editMutation - ? mutations.map((mutationToCompare) => + ? mutations.map((mutationToCompare): Mutation => mutationToCompare.id === mutationToEdit.id ? mutationToEdit : mutationToCompare, ) : [...mutations, mutationToEdit], @@ -297,14 +308,14 @@ function AddMappingForm({ onSave, sources, targets, initialData }: MappingModalP /> - setConditionModal(false)}> + setConditionModal(false)}> { - setConditions((conditions) => + onSave={(conditionToEdit): void => { + setConditions((conditions): Condition[] => editCondition - ? conditions.map((conditionToCompare) => + ? conditions.map((conditionToCompare): Condition => conditionToCompare.id === conditionToEdit.id ? conditionToEdit : conditionToCompare, ) : [...conditions, conditionToEdit], diff --git a/src/main/frontend/app/components/datamapper/forms/add-mutation-form.tsx b/src/main/frontend/app/components/datamapper/forms/add-mutation-form.tsx index dc47679d..06699dec 100644 --- a/src/main/frontend/app/components/datamapper/forms/add-mutation-form.tsx +++ b/src/main/frontend/app/components/datamapper/forms/add-mutation-form.tsx @@ -21,11 +21,11 @@ function AddMutationForm({ sources: Source[] onSave: (data: Mutation) => void mutationToEdit?: Mutation -}) { +}): JSX.Element { const newId = `mutation-${useId()}` const id = mutationToEdit?.id ?? newId const mutations: MutationsConfig = mutationConfig as MutationsConfig - sources = sources.filter((source) => source.id != id) + sources = sources.filter((source): boolean => source.id != id) const [mutation, setMutation] = useState({ id, @@ -35,9 +35,9 @@ function AddMutationForm({ }) const isFormIncomplete = !mutation.mutationType || mutation.inputs.length === 0 - const placeholder = useMemo(() => generateMutationName(mutation), [mutation]) + const placeholder = useMemo((): string => generateMutationName(mutation), [mutation]) - function handleSave() { + function handleSave(): void { if (!mutation.name) mutation.name = placeholder onSave(mutation) } @@ -49,7 +49,16 @@ function AddMutationForm({ setMutation((toSetMutation) => ({ ...toSetMutation, name: event.target.value }))} + onChange={(event): void => + setMutation( + ( + toSetMutation, + ): { name: string; id: string; mutationType: MutationType | null; inputs: MutationInput[] } => ({ + ...toSetMutation, + name: event.target.value, + }), + ) + } placeholder={placeholder} /> @@ -57,8 +66,8 @@ function AddMutationForm({ { - const mutationType = mutations.mutations.find((mutationToFind) => mutationToFind.name === e) ?? null + onChange={(e): void => { + const mutationType = mutations.mutations.find((mutationToFind): boolean => mutationToFind.name === e) ?? null setMutation({ id, name: mutation.name, @@ -67,7 +76,7 @@ function AddMutationForm({ }) }} options={Object.fromEntries( - mutations.mutations.map((mutationToMap) => [mutationToMap.name, mutationToMap.name]), + mutations.mutations.map((mutationToMap): [string, string] => [mutationToMap.name, mutationToMap.name]), )} /> @@ -88,30 +97,34 @@ function MutationDetailsForm({ mutation: Mutation setMutation: React.Dispatch> sources: Source[] -}) { - function addInputField(mutationTypeInput: MutationTypeInput) { - setMutation((mutationToSet) => ({ - ...mutationToSet, - inputs: [ - ...mutationToSet.inputs, - { - type: mutationTypeInput.type === 'source' ? 'source' : 'defaultValue', - value: '', - }, - ], - })) +}): JSX.Element { + function addInputField(mutationTypeInput: MutationTypeInput): void { + setMutation( + (mutationToSet): { inputs: MutationInput[]; name: string; id: string; mutationType: MutationType | null } => ({ + ...mutationToSet, + inputs: [ + ...mutationToSet.inputs, + { + type: mutationTypeInput.type === 'source' ? 'source' : 'defaultValue', + value: '', + }, + ], + }), + ) } - function removeInput(index: number) { - setMutation((mutations) => ({ - ...mutations, - inputs: mutations.inputs.filter((_, index_) => index_ !== index), - })) + function removeInput(index: number): void { + setMutation( + (mutations): { inputs: MutationInput[]; name: string; id: string; mutationType: MutationType | null } => ({ + ...mutations, + inputs: mutations.inputs.filter((_, index_): boolean => index_ !== index), + }), + ) } return (
- {mutation.mutationType?.inputs.map((mutationTypeInput, index) => { + {mutation.mutationType?.inputs.map((mutationTypeInput, index): JSX.Element => { return (
{/* Base input */} @@ -125,7 +138,7 @@ function MutationDetailsForm({ {/* Render extra expandable inputs */} {mutationTypeInput.expandable && - mutation.inputs.slice(index + 1).map((_, extraIndex) => { + mutation.inputs.slice(index + 1).map((_, extraIndex): JSX.Element => { const actualIndex = extraIndex + index + 1 return ( removeInput(actualIndex)} + onDelete={(): void => removeInput(actualIndex)} /> ) })} {/* Add input button */} {mutationTypeInput.expandable && ( - )} @@ -170,24 +183,26 @@ function MutationInputField({ sources: Source[] showDelete?: boolean onDelete?: () => void -}) { +}): JSX.Element { if (mutationInput.inputsAllowed != 'all') { - sources = sources.filter((source) => source.type == mutationInput.inputsAllowed) + sources = sources.filter((source): boolean => source.type == mutationInput.inputsAllowed) } const value = mutation.inputs[index] ?? { type: mutationInput.type, value: '', } - function updateInput(updated: MutationInput) { - setMutation((mutation) => { - const newInputs = [...mutation.inputs] - newInputs[index] = { ...newInputs[index], ...updated } - return { ...mutation, inputs: newInputs } - }) + function updateInput(updated: MutationInput): void { + setMutation( + (mutation): { inputs: MutationInput[]; name: string; id: string; mutationType: MutationType | null } => { + const newInputs = [...mutation.inputs] + newInputs[index] = { ...newInputs[index], ...updated } + return { ...mutation, inputs: newInputs } + }, + ) } - function handleSourceChange(sourceId: string) { + function handleSourceChange(sourceId: string): void { if (sourceId === 'defaultValue') { updateInput({ type: mutationInput.type == 'attribute' ? mutationInput.type : 'defaultValue', @@ -196,7 +211,7 @@ function MutationInputField({ }) return } - const source = sources.find((source) => source.id === sourceId) + const source = sources.find((source): boolean => source.id === sourceId) if (!source) return updateInput({ type: 'source', sourceId: source.id, value: source.label }) } @@ -216,7 +231,7 @@ function MutationInputField({ className="mb-4 max-w-55" options={Object.fromEntries([ ...(mutationInput.allowDefaultValue ? [['defaultValue', 'defaultValue']] : []), - ...sources.map((source) => [source.id, source.label]), + ...sources.map((source): string[] => [source.id, source.label]), ])} /> )} @@ -224,7 +239,7 @@ function MutationInputField({ {(mutationInput.type === 'attribute' || value.type === 'defaultValue') && ( + onChange={(event): void => updateInput({ type: mutationInput.type === 'attribute' ? mutationInput.type : 'defaultValue', value: event.target.value, diff --git a/src/main/frontend/app/components/datamapper/react-flow/array-group-node.tsx b/src/main/frontend/app/components/datamapper/react-flow/array-group-node.tsx index e83e5510..e915f536 100644 --- a/src/main/frontend/app/components/datamapper/react-flow/array-group-node.tsx +++ b/src/main/frontend/app/components/datamapper/react-flow/array-group-node.tsx @@ -13,7 +13,13 @@ export type ArrayGroupNodeProperties = { onHighlight?: (id: string) => void } -function ArrayGroupNode({ id, data, variant = 'source', onDelete, onHighlight }: ArrayGroupNodeProperties) { +function ArrayGroupNode({ + id, + data, + variant = 'source', + onDelete, + onHighlight, +}: ArrayGroupNodeProperties): JSX.Element { const checked = data?.checked const connections = useNodeConnections({ @@ -22,14 +28,14 @@ function ArrayGroupNode({ id, data, variant = 'source', onDelete, onHighlight }: const isConnectable = connections.length === 0 || variant === 'source' - const updateChecked = () => { + const updateChecked = (): void => { const newChecked = !checked - data.setNodes?.((nodes: Node[]) => - nodes.map((node) => (node.id === id ? { ...node, data: { ...node.data, checked: newChecked } } : node)), + data.setNodes?.((nodes: Node[]): Node[] => + nodes.map((node): Node => (node.id === id ? { ...node, data: { ...node.data, checked: newChecked } } : node)), ) if (variant != 'source') { - data.setNodes?.((nodes: Node[]) => - nodes.map((node) => + data.setNodes?.((nodes: Node[]): Node[] => + nodes.map((node): Node => node.id !== id && node.parentId?.includes('target') ? { ...node, data: { ...node.data, checked: false } } : node, @@ -78,13 +84,13 @@ function ArrayGroupNode({ id, data, variant = 'source', onDelete, onHighlight }:
{data.label}
{ + onClick={(): void => { onHighlight?.(id) }} /> { + onClick={(): void => { onDelete?.(id) }} /> diff --git a/src/main/frontend/app/components/datamapper/react-flow/array-mapping-node.tsx b/src/main/frontend/app/components/datamapper/react-flow/array-mapping-node.tsx index 3c2ad80d..2ed94d4b 100644 --- a/src/main/frontend/app/components/datamapper/react-flow/array-mapping-node.tsx +++ b/src/main/frontend/app/components/datamapper/react-flow/array-mapping-node.tsx @@ -10,10 +10,10 @@ export type ArrayMappingNodeProperties = { onDelete?: (id: string) => void } -function ArrayMappingNode({ id, data, onClick, onDelete }: ArrayMappingNodeProperties) { +function ArrayMappingNode({ id, data, onClick, onDelete }: ArrayMappingNodeProperties): JSX.Element { return (
onClick?.(id)} + onClick={(): void | undefined => onClick?.(id)} className={`group relative flex max-h-12.5 justify-between rounded-md p-2`} style={{ backgroundColor: data.colour || 'var(--color-backdrop)', @@ -30,7 +30,7 @@ function ArrayMappingNode({ id, data, onClick, onDelete }: ArrayMappingNodePrope
{ + onClick={(): void => { onDelete?.(id) }} /> diff --git a/src/main/frontend/app/components/datamapper/react-flow/extra-source-node.tsx b/src/main/frontend/app/components/datamapper/react-flow/extra-source-node.tsx index b65028f4..7d5d3a58 100644 --- a/src/main/frontend/app/components/datamapper/react-flow/extra-source-node.tsx +++ b/src/main/frontend/app/components/datamapper/react-flow/extra-source-node.tsx @@ -10,7 +10,7 @@ export type ExtraSourceNodeProperties = { onHighlight?: (id: string) => void } -function ExtraSourceNode({ id, data, onDelete, onHighlight }: ExtraSourceNodeProperties) { +function ExtraSourceNode({ id, data, onDelete, onHighlight }: ExtraSourceNodeProperties): JSX.Element { return (
{/* Header */} @@ -19,12 +19,12 @@ function ExtraSourceNode({ id, data, onDelete, onHighlight }: ExtraSourceNodePro {data.label ? `extra source: ${data.label}` : 'ExtraSource'}
{ + onClick={(): void => { onHighlight?.(id) }} /> { + onClick={(): void => { onDelete?.(id) }} /> diff --git a/src/main/frontend/app/components/datamapper/react-flow/import-schematic-node.tsx b/src/main/frontend/app/components/datamapper/react-flow/import-schematic-node.tsx index 75b6ed73..8aa8c855 100644 --- a/src/main/frontend/app/components/datamapper/react-flow/import-schematic-node.tsx +++ b/src/main/frontend/app/components/datamapper/react-flow/import-schematic-node.tsx @@ -18,7 +18,7 @@ export type ImportSchematicNodeprops = { } & Record } -function ImportSchematicNode({ data }: ImportSchematicNodeprops) { +function ImportSchematicNode({ data }: ImportSchematicNodeprops): JSX.Element { const [isDragging, setIsDragging] = useState(false) const [file, setFile] = useState(null) return ( @@ -28,12 +28,12 @@ function ImportSchematicNode({ data }: ImportSchematicNodeprops) { isDragging || file ? 'bg-selected border! border-solid' : 'border-2', )} style={{ width: `${GROUP_WIDTH}px` }} - onDragOver={(e) => { + onDragOver={(e): void => { e.preventDefault() setIsDragging(true) }} - onDragLeave={() => setIsDragging(false)} - onDrop={(e) => { + onDragLeave={(): void => setIsDragging(false)} + onDrop={(e): void => { e.preventDefault() setIsDragging(false) @@ -50,7 +50,7 @@ function ImportSchematicNode({ data }: ImportSchematicNodeprops) { fileType={data.fileType} file={file} setFile={setFile} - importFunc={(file: File) => data.importFunc(file, data.side, file.name.replace(data.fileType, ''))} + importFunc={(file: File): void => data.importFunc(file, data.side, file.name.replace(data.fileType, ''))} /> diff --git a/src/main/frontend/app/components/datamapper/react-flow/labeled-group-node.tsx b/src/main/frontend/app/components/datamapper/react-flow/labeled-group-node.tsx index 44cf0ff7..1e682bd8 100644 --- a/src/main/frontend/app/components/datamapper/react-flow/labeled-group-node.tsx +++ b/src/main/frontend/app/components/datamapper/react-flow/labeled-group-node.tsx @@ -14,7 +14,7 @@ export type LabeledGroupNodeProperties = { onHighlight?: (id: string) => void } -function LabeledGroupNode({ id, data, onEdit, onDelete, onHighlight }: LabeledGroupNodeProperties) { +function LabeledGroupNode({ id, data, onEdit, onDelete, onHighlight }: LabeledGroupNodeProperties): JSX.Element { return (
{data.label}
{ + onClick={(): void => { onHighlight?.(id) }} /> { + onClick={(): void => { onEdit?.(data) }} /> { + onClick={(): void => { onDelete?.(id) }} /> diff --git a/src/main/frontend/app/components/datamapper/react-flow/mapping-node.tsx b/src/main/frontend/app/components/datamapper/react-flow/mapping-node.tsx index 579a4aed..e29ac0f5 100644 --- a/src/main/frontend/app/components/datamapper/react-flow/mapping-node.tsx +++ b/src/main/frontend/app/components/datamapper/react-flow/mapping-node.tsx @@ -14,10 +14,10 @@ export type MappingNodeProperties = { onEdit?: (data: MappingNodeData) => void } -function MappingNode({ id, data, onClick, onDelete, onEdit }: MappingNodeProperties) { +function MappingNode({ id, data, onClick, onDelete, onEdit }: MappingNodeProperties): JSX.Element { return (
onClick?.(id)} + onClick={(): void | undefined => onClick?.(id)} className={`group flex max-h-12.5 justify-between rounded-md p-2`} style={{ backgroundColor: data.colour || 'var(--color-backdrop)', @@ -35,14 +35,14 @@ function MappingNode({ id, data, onClick, onDelete, onEdit }: MappingNodePropert
{ + onClick={(): void => { onEdit?.(data) }} /> { + onClick={(): void => { onDelete?.(id) }} /> diff --git a/src/main/frontend/app/components/datamapper/react-flow/node-types.tsx b/src/main/frontend/app/components/datamapper/react-flow/node-types.tsx index 71745457..6df396da 100644 --- a/src/main/frontend/app/components/datamapper/react-flow/node-types.tsx +++ b/src/main/frontend/app/components/datamapper/react-flow/node-types.tsx @@ -30,12 +30,12 @@ export const getNodeTypes = ({ setEditingMapping, openMapping, }: GetNodeTypesParameters): NodeTypes => ({ - sourceOnly: (properties: OneEdgeNodeProperties) => ( + sourceOnly: (properties: OneEdgeNodeProperties): JSX.Element => ( { + onEdit={(data): void => { if (!data) { return } @@ -44,16 +44,16 @@ export const getNodeTypes = ({ openModelType.current = 'source' setAddFieldModal(true) }} - onDelete={(id) => flow.deleteNode(id)} - onHighlight={(id) => flow.highlightFromPropertyNode(id)} + onDelete={(id): void => flow.deleteNode(id)} + onHighlight={(id): void => flow.highlightFromPropertyNode(id)} /> ), - targetOnly: (properties: OneEdgeNodeProperties) => ( + targetOnly: (properties: OneEdgeNodeProperties): JSX.Element => ( { + onEdit={(data): void => { if (!data) { return } @@ -62,15 +62,15 @@ export const getNodeTypes = ({ openModelType.current = 'target' setAddFieldModal(true) }} - onDelete={(id) => flow.deleteNode(id)} - onHighlight={(id) => flow.highlightFromPropertyNode(id)} + onDelete={(id): void => flow.deleteNode(id)} + onHighlight={(id): void => flow.highlightFromPropertyNode(id)} /> ), - labeledGroup: (node: LabeledGroupNodeProperties) => ( + labeledGroup: (node: LabeledGroupNodeProperties): JSX.Element => ( flow.highlightFromPropertyNode(id)} - onEdit={(data) => { + onHighlight={(id): void => flow.highlightFromPropertyNode(id)} + onEdit={(data): void => { if (!data) { return } @@ -79,53 +79,53 @@ export const getNodeTypes = ({ openModelType.current = 'target' setAddFieldModal(true) }} - onDelete={(id) => flow.deleteNode(id)} + onDelete={(id): void => flow.deleteNode(id)} /> ), - sourceArrayGroup: (node: ArrayGroupNodeProperties) => ( + sourceArrayGroup: (node: ArrayGroupNodeProperties): JSX.Element => ( flow.highlightFromPropertyNode(id)} - onDelete={(id) => flow.deleteNode(id)} + onHighlight={(id): void => flow.highlightFromPropertyNode(id)} + onDelete={(id): void => flow.deleteNode(id)} /> ), - targetArrayGroup: (node: ArrayGroupNodeProperties) => ( + targetArrayGroup: (node: ArrayGroupNodeProperties): JSX.Element => ( flow.highlightFromPropertyNode(id)} - onDelete={(id) => flow.deleteNode(id)} + onHighlight={(id): void => flow.highlightFromPropertyNode(id)} + onDelete={(id): void => flow.deleteNode(id)} /> ), - extraSourceNode: (node: ExtraSourceNodeProperties) => ( + extraSourceNode: (node: ExtraSourceNodeProperties): JSX.Element => ( flow.highlightFromPropertyNode(id)} - onDelete={(id) => flow.deleteNode(id)} + onHighlight={(id): void => flow.highlightFromPropertyNode(id)} + onDelete={(id): void => flow.deleteNode(id)} /> ), - mappingNode: (node: MappingNodeProperties) => ( + mappingNode: (node: MappingNodeProperties): JSX.Element => ( flow.highlightFromMappingNode(id)} - onEdit={(data) => { + onClick={(id): void => flow.highlightFromMappingNode(id)} + onEdit={(data): void => { setEditingMapping(data) openMapping() }} - onDelete={(id) => { + onDelete={(id): void => { flow.deleteMapping(id) }} /> ), - arrayMappingNode: (node: ArrayMappingNodeProperties) => ( + arrayMappingNode: (node: ArrayMappingNodeProperties): JSX.Element => ( flow.highlightFromMappingNode(id)} - onDelete={(id) => { + onClick={(id): void => flow.highlightFromMappingNode(id)} + onDelete={(id): void => { flow.deleteMapping(id) }} /> ), - importSchematicNode: (node: ImportSchematicNodeprops) => , + importSchematicNode: (node: ImportSchematicNodeprops): JSX.Element => , }) diff --git a/src/main/frontend/app/components/datamapper/react-flow/one-edge-node.tsx b/src/main/frontend/app/components/datamapper/react-flow/one-edge-node.tsx index 38013b89..93f216b3 100644 --- a/src/main/frontend/app/components/datamapper/react-flow/one-edge-node.tsx +++ b/src/main/frontend/app/components/datamapper/react-flow/one-edge-node.tsx @@ -16,7 +16,14 @@ export type OneEdgeNodeProperties = { onHighlight?: (id: string) => void } -function OneEdgeNode({ id, data, variant = 'source', onEdit, onDelete, onHighlight }: OneEdgeNodeProperties) { +function OneEdgeNode({ + id, + data, + variant = 'source', + onEdit, + onDelete, + onHighlight, +}: OneEdgeNodeProperties): JSX.Element { const checked = data?.checked const connections = useNodeConnections({ @@ -25,14 +32,14 @@ function OneEdgeNode({ id, data, variant = 'source', onEdit, onDelete, onHighlig const isConnectable = connections.length === 0 || variant === 'source' - const updateChecked = () => { + const updateChecked = (): void => { const newChecked = !checked - data.setNodes?.((nodes: Node[]) => - nodes.map((node) => (node.id === id ? { ...node, data: { ...node.data, checked: newChecked } } : node)), + data.setNodes?.((nodes: Node[]): Node[] => + nodes.map((node): Node => (node.id === id ? { ...node, data: { ...node.data, checked: newChecked } } : node)), ) if (variant != 'source') { - data.setNodes?.((nodes: Node[]) => - nodes.map((node) => + data.setNodes?.((nodes: Node[]): Node[] => + nodes.map((node): Node => node.id !== id && node.parentId?.includes('target') ? { ...node, data: { ...node.data, checked: false } } : node, @@ -71,19 +78,19 @@ function OneEdgeNode({ id, data, variant = 'source', onEdit, onDelete, onHighlig {/* Right side */}
{ + onClick={(): void => { onHighlight?.(id) }} /> { + onClick={(): void => { onEdit?.(data) }} /> { + onClick={(): void => { onDelete?.(id) }} /> diff --git a/src/main/frontend/app/components/dialog.tsx b/src/main/frontend/app/components/dialog.tsx index e82fdb13..9416b7d5 100644 --- a/src/main/frontend/app/components/dialog.tsx +++ b/src/main/frontend/app/components/dialog.tsx @@ -9,8 +9,14 @@ type DialogProperties = { className?: string overlay?: ReactNode } -export default function Dialog({ onClose, title, children, className, overlay }: Readonly) { - const handleBackdropClick = (event: MouseEvent) => { +export default function Dialog({ + onClose, + title, + children, + className, + overlay, +}: Readonly): ReactPortal { + const handleBackdropClick = (event: MouseEvent): void => { if (event.target === event.currentTarget) onClose() } diff --git a/src/main/frontend/app/components/directory-picker/directory-picker.tsx b/src/main/frontend/app/components/directory-picker/directory-picker.tsx index 3abf4ceb..45d070e7 100644 --- a/src/main/frontend/app/components/directory-picker/directory-picker.tsx +++ b/src/main/frontend/app/components/directory-picker/directory-picker.tsx @@ -22,7 +22,7 @@ export default function DirectoryPicker({ onCancel, rootLabel = 'Computer', initialPath, -}: Readonly) { +}: Readonly): JSX.Element { const [currentPath, setCurrentPath] = useState('') const [parentPath, setParentPath] = useState('') const [entries, setEntries] = useState([]) @@ -31,14 +31,19 @@ export default function DirectoryPicker({ const [error, setError] = useState(null) const [isCreatingFolder, setIsCreatingFolder] = useState(false) - const loadEntries = useCallback(async (path: string) => { + const loadEntries = useCallback(async (path: string): Promise => { setLoading(true) setError(null) setSelectedEntry(null) setIsCreatingFolder(false) try { const result = await filesystemService.browse(path) - setEntries(result.entries.map((entry) => ({ ...entry, path: normalizePath(entry.path) }))) + setEntries( + result.entries.map((entry): { path: string; name: string; type: EntryType; projectRoot: boolean } => ({ + ...entry, + path: normalizePath(entry.path), + })), + ) setCurrentPath(normalizePath(result.resolvedPath)) setParentPath(normalizePath(result.parentPath)) } catch (error) { @@ -52,22 +57,22 @@ export default function DirectoryPicker({ } }, []) - useDirectoryWatcher(currentPath, () => void loadEntries(currentPath)) + useDirectoryWatcher(currentPath, (): undefined => void loadEntries(currentPath)) - useEffect(() => { + useEffect((): void => { setSelectedEntry(null) loadEntries(initialPath ?? '') }, [loadEntries, initialPath]) - const handleClick = (entry: FilesystemEntry) => { + const handleClick = (entry: FilesystemEntry): void => { setSelectedEntry(entry.path) } - const handleDoubleClick = (entry: FilesystemEntry) => { + const handleDoubleClick = (entry: FilesystemEntry): void => { loadEntries(entry.path) } - const handleCreateFolder = async (folderName: string) => { + const handleCreateFolder = async (folderName: string): Promise => { const basePath = selectedEntry ?? currentPath const separator = basePath.includes('\\') ? '\\' : '/' const newPath = `${basePath}${separator}${folderName}` @@ -84,7 +89,7 @@ export default function DirectoryPicker({ const canGoUp = parentPath !== '' const activePath = selectedEntry ?? currentPath - useSubmitOnEnter(() => onSelect(activePath), !isCreatingFolder && !!activePath) + useSubmitOnEnter((): void => onSelect(activePath), !isCreatingFolder && !!activePath) return (
@@ -96,7 +101,7 @@ export default function DirectoryPicker({
@@ -158,7 +163,7 @@ export default function DirectoryPicker({
{!collapsed && (
- {files.map((file) => { + {files.map((file): JSX.Element => { const fileName = file.split('/').pop() || file const dirPath = file.includes('/') ? file.slice(0, file.lastIndexOf('/')) : '' @@ -76,14 +75,14 @@ function FileSection({ 'group mx-2 flex items-center gap-2 rounded px-3 py-1 text-xs hover:cursor-pointer', selectedFile === file ? 'bg-selected' : 'hover:bg-hover', )} - onClick={() => onSelectFile(file)} + onClick={(): void => onSelectFile(file)} > onToggleFile(file)} + onChange={(): void => onToggleFile(file)} title={checkboxChecked ? 'Deselect all chunks' : 'Select all chunks'} - onClick={(mouseEvent) => mouseEvent.stopPropagation()} + onClick={(mouseEvent): void => mouseEvent.stopPropagation()} />