From d1db13c3a7cc9a341286af4558e4f0383488db0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2026 13:18:46 +0530 Subject: [PATCH 01/21] chore(deps): bump vite in the npm_and_yarn group across 1 directory (#8863) Bumps the npm_and_yarn group with 1 update in the / directory: [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite). Updates `vite` from 7.3.1 to 7.3.2 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v7.3.2/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v7.3.2/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 7.3.2 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 324 ++++++++++++++++++++++---------------------- pnpm-workspace.yaml | 2 +- 2 files changed, 163 insertions(+), 163 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e048c47f888..a469bae0e3e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -99,7 +99,7 @@ overrides: prosemirror-view: 1.40.0 '@types/express': 4.17.23 typescript: 5.8.3 - vite: 7.3.1 + vite: 7.3.2 qs: 6.14.2 diff: 5.2.2 webpack: 5.104.1 @@ -239,7 +239,7 @@ importers: version: link:../../packages/typescript-config '@react-router/dev': specifier: 'catalog:' - version: 7.13.1(@react-router/serve@7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))(yaml@2.8.3) + version: 7.13.1(@react-router/serve@7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))(yaml@2.8.3) '@types/lodash-es': specifier: 'catalog:' version: 4.17.12 @@ -259,11 +259,11 @@ importers: specifier: 5.8.3 version: 5.8.3 vite: - specifier: 7.3.1 - version: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + specifier: 7.3.2 + version: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + version: 5.1.4(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) apps/live: dependencies: @@ -523,7 +523,7 @@ importers: version: link:../../packages/typescript-config '@react-router/dev': specifier: 'catalog:' - version: 7.13.1(@react-router/serve@7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))(yaml@2.8.3) + version: 7.13.1(@react-router/serve@7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))(yaml@2.8.3) '@tailwindcss/typography': specifier: 0.5.19 version: 0.5.19 @@ -546,11 +546,11 @@ importers: specifier: 5.8.3 version: 5.8.3 vite: - specifier: 7.3.1 - version: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + specifier: 7.3.2 + version: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + version: 5.1.4(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) apps/web: dependencies: @@ -725,7 +725,7 @@ importers: version: link:../../packages/typescript-config '@react-router/dev': specifier: 'catalog:' - version: 7.13.1(@react-router/serve@7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))(yaml@2.8.3) + version: 7.13.1(@react-router/serve@7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))(yaml@2.8.3) '@tailwindcss/typography': specifier: 0.5.19 version: 0.5.19 @@ -751,11 +751,11 @@ importers: specifier: 5.8.3 version: 5.8.3 vite: - specifier: 7.3.1 - version: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + specifier: 7.3.2 + version: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + version: 5.1.4(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) packages/codemods: devDependencies: @@ -1157,13 +1157,13 @@ importers: version: link:../typescript-config '@storybook/addon-designs': specifier: 10.0.2 - version: 10.0.2(@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + version: 10.0.2(@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/addon-docs': specifier: 9.1.10 - version: 9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + version: 9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/react-vite': specifier: 9.1.10 - version: 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + version: 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) '@types/react': specifier: 'catalog:' version: 18.3.11 @@ -1172,7 +1172,7 @@ importers: version: 18.3.1 storybook: specifier: 9.1.19 - version: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + version: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) tsdown: specifier: 'catalog:' version: 0.16.0(typescript@5.8.3)(unrun@0.2.34) @@ -1371,34 +1371,34 @@ importers: version: link:../typescript-config '@storybook/addon-essentials': specifier: ^8.1.1 - version: 8.6.14(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + version: 8.6.14(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/addon-interactions': specifier: ^8.1.1 - version: 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + version: 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/addon-links': specifier: ^8.1.1 - version: 8.6.14(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + version: 8.6.14(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/addon-onboarding': specifier: ^8.1.1 - version: 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + version: 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/addon-styling-webpack': specifier: ^1.0.0 - version: 1.0.1(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) + version: 1.0.1(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) '@storybook/addon-webpack5-compiler-swc': specifier: ^1.0.2 version: 1.0.6(@swc/helpers@0.5.17)(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) '@storybook/blocks': specifier: ^8.1.1 - version: 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + version: 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/react': specifier: ^8.1.1 - version: 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) + version: 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) '@storybook/react-webpack5': specifier: ^8.1.1 - version: 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(@swc/core@1.13.5(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) + version: 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(@swc/core@1.13.5(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) '@storybook/test': specifier: ^8.1.1 - version: 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + version: 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@types/lodash-es': specifier: 'catalog:' version: 4.17.12 @@ -1425,7 +1425,7 @@ importers: version: 6.2.0(postcss@8.5.6) storybook: specifier: 9.1.19 - version: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + version: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) tsdown: specifier: 'catalog:' version: 0.16.0(typescript@5.8.3)(unrun@0.2.34) @@ -2321,7 +2321,7 @@ packages: resolution: {integrity: sha512-J4BaTocTOYFkMHIra1JDWrMWpNmBl4EkplIwHEsV8aeUOtdWjwSnln9U7twjMFTAEB7mptNtSKyVi1Y2W9sDJw==} peerDependencies: typescript: 5.8.3 - vite: 7.3.1 + vite: 7.3.2 peerDependenciesMeta: typescript: optional: true @@ -3103,7 +3103,7 @@ packages: react-router: ^7.13.1 react-server-dom-webpack: ^19.2.3 typescript: 5.8.3 - vite: 7.3.1 + vite: 7.3.2 wrangler: ^3.28.2 || ^4.0.0 peerDependenciesMeta: '@react-router/serve': @@ -3603,7 +3603,7 @@ packages: resolution: {integrity: sha512-0ogI+toZJYaFptcFpRcRPOZ9/NrFUYhiaI09ggeEB1FF9ygHMVsobp4eaj4HjZI6V3x7cQwkd2ZmxAMQDBQuMA==} peerDependencies: storybook: ^9.1.10 - vite: 7.3.1 + vite: 7.3.2 '@storybook/builder-webpack5@8.6.14': resolution: {integrity: sha512-YZYAqc6NBKoMTKZpjxnkMch6zDtMkBZdS/yaji1+wJX2QPFBwTbSh7SpeBxDp1S11gXSAJ4f1btUWeqSqo8nJA==} @@ -3703,7 +3703,7 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta storybook: ^9.1.10 - vite: 7.3.1 + vite: 7.3.2 '@storybook/react-webpack5@8.6.14': resolution: {integrity: sha512-ka0q9tQBLruhO38sybP/MkZzejqAltce7HJTJ2KKbUYUlbvuG7m56tBX7DVC5JaImbsO3b8fqOrKH7gRt4KYrQ==} @@ -4467,7 +4467,7 @@ packages: resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: msw: ^2.4.9 - vite: 7.3.1 + vite: 7.3.2 peerDependenciesMeta: msw: optional: true @@ -4478,7 +4478,7 @@ packages: resolution: {integrity: sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==} peerDependencies: msw: ^2.4.9 - vite: 7.3.1 + vite: 7.3.2 peerDependenciesMeta: msw: optional: true @@ -8489,13 +8489,13 @@ packages: vite-tsconfig-paths@5.1.4: resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==} peerDependencies: - vite: 7.3.1 + vite: 7.3.2 peerDependenciesMeta: vite: optional: true - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + vite@7.3.2: + resolution: {integrity: sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -9615,12 +9615,12 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.6.1(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': dependencies: glob: 11.1.0 magic-string: 0.30.21 react-docgen-typescript: 2.4.0(typescript@5.8.3) - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) optionalDependencies: typescript: 5.8.3 @@ -10298,7 +10298,7 @@ snapshots: '@react-pdf/primitives': 4.1.1 '@react-pdf/stylesheet': 6.1.2 - '@react-router/dev@7.13.1(@react-router/serve@7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))(yaml@2.8.3)': + '@react-router/dev@7.13.1(@react-router/serve@7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3))(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(terser@5.43.1)(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))(yaml@2.8.3)': dependencies: '@babel/core': 7.28.4 '@babel/generator': 7.28.5 @@ -10328,7 +10328,7 @@ snapshots: semver: 7.7.4 tinyglobby: 0.2.15 valibot: 1.2.0(typescript@5.8.3) - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) vite-node: 3.2.4(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) optionalDependencies: '@react-router/serve': 7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) @@ -10563,133 +10563,133 @@ snapshots: '@standard-schema/spec@1.0.0': {} - '@storybook/addon-actions@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-actions@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 '@types/uuid': 9.0.8 dequal: 2.0.3 polished: 4.3.1 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) uuid: 9.0.1 - '@storybook/addon-backgrounds@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-backgrounds@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 memoizerific: 1.11.3 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 - '@storybook/addon-controls@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-controls@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 dequal: 2.0.3 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 - '@storybook/addon-designs@10.0.2(@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-designs@10.0.2(@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@figspec/react': 1.0.4(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) optionalDependencies: - '@storybook/addon-docs': 9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-docs': 9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/addon-docs@8.6.14(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-docs@8.6.14(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@mdx-js/react': 3.1.0(@types/react@18.3.11)(react@18.3.1) - '@storybook/blocks': 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/csf-plugin': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/react-dom-shim': 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/blocks': 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/csf-plugin': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/react-dom-shim': 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-docs@9.1.10(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@mdx-js/react': 3.1.0(@types/react@18.3.11)(react@18.3.1) - '@storybook/csf-plugin': 9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/csf-plugin': 9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@storybook/react-dom-shim': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/react-dom-shim': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-essentials@8.6.14(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': - dependencies: - '@storybook/addon-actions': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/addon-backgrounds': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/addon-controls': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/addon-docs': 8.6.14(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/addon-highlight': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/addon-measure': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/addon-outline': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/addon-toolbars': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/addon-viewport': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + '@storybook/addon-essentials@8.6.14(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + dependencies: + '@storybook/addon-actions': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-backgrounds': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-controls': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-docs': 8.6.14(@types/react@18.3.11)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-highlight': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-measure': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-outline': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-toolbars': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/addon-viewport': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-highlight@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-highlight@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/addon-interactions@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-interactions@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/test': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/instrumenter': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/test': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) polished: 4.3.1 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 - '@storybook/addon-links@8.6.14(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-links@8.6.14(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 optionalDependencies: react: 18.3.1 - '@storybook/addon-measure@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-measure@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) tiny-invariant: 1.3.3 - '@storybook/addon-onboarding@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-onboarding@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/addon-outline@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-outline@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 - '@storybook/addon-styling-webpack@1.0.1(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)))': + '@storybook/addon-styling-webpack@1.0.1(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)))': dependencies: - '@storybook/node-logger': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/node-logger': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) webpack: 5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)) transitivePeerDependencies: - storybook - '@storybook/addon-toolbars@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-toolbars@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/addon-viewport@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/addon-viewport@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: memoizerific: 1.11.3 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) '@storybook/addon-webpack5-compiler-swc@1.0.6(@swc/helpers@0.5.17)(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)))': dependencies: @@ -10699,25 +10699,25 @@ snapshots: - '@swc/helpers' - webpack - '@storybook/blocks@8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/blocks@8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/icons': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 optionalDependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/builder-vite@9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': + '@storybook/builder-vite@9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': dependencies: - '@storybook/csf-plugin': 9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + '@storybook/csf-plugin': 9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) - '@storybook/builder-webpack5@8.6.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': + '@storybook/builder-webpack5@8.6.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': dependencies: - '@storybook/core-webpack': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/core-webpack': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@types/semver': 7.7.1 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 @@ -10731,7 +10731,7 @@ snapshots: path-browserify: 1.0.1 process: 0.11.10 semver: 7.7.4 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) style-loader: 3.3.4(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) terser-webpack-plugin: 5.3.16(@swc/core@1.13.5(@swc/helpers@0.5.17))(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) ts-dedent: 2.2.0 @@ -10751,23 +10751,23 @@ snapshots: - uglify-js - webpack-cli - '@storybook/components@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/components@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/core-webpack@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/core-webpack@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) ts-dedent: 2.2.0 - '@storybook/csf-plugin@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/csf-plugin@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) unplugin: 1.16.1 - '@storybook/csf-plugin@9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/csf-plugin@9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) unplugin: 1.16.1 '@storybook/global@5.0.0': {} @@ -10777,24 +10777,24 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@storybook/instrumenter@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/instrumenter@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 '@vitest/utils': 2.1.9 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/manager-api@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/manager-api@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/node-logger@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/node-logger@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/preset-react-webpack@8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(@swc/core@1.13.5(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': + '@storybook/preset-react-webpack@8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(@swc/core@1.13.5(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': dependencies: - '@storybook/core-webpack': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) + '@storybook/core-webpack': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))) '@types/semver': 7.7.1 find-up: 5.0.0 @@ -10804,7 +10804,7 @@ snapshots: react-dom: 18.3.1(react@18.3.1) resolve: 1.22.10 semver: 7.7.4 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) tsconfig-paths: 4.2.0 webpack: 5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)) optionalDependencies: @@ -10817,9 +10817,9 @@ snapshots: - uglify-js - webpack-cli - '@storybook/preview-api@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/preview-api@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17)))': dependencies: @@ -10835,46 +10835,46 @@ snapshots: transitivePeerDependencies: - supports-color - '@storybook/react-dom-shim@8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/react-dom-shim@8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/react-dom-shim@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/react-dom-shim@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/react-vite@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': + '@storybook/react-vite@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.59.0)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.6.1(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) '@rollup/pluginutils': 5.2.0(rollup@4.59.0) - '@storybook/builder-vite': 9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/react': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) + '@storybook/builder-vite': 9.1.10(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + '@storybook/react': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) find-up: 7.0.0 magic-string: 0.30.21 react: 18.3.1 react-docgen: 8.0.1 react-dom: 18.3.1(react@18.3.1) resolve: 1.22.10 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) tsconfig-paths: 4.2.0 - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) transitivePeerDependencies: - rollup - supports-color - typescript - '@storybook/react-webpack5@8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(@swc/core@1.13.5(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': + '@storybook/react-webpack5@8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(@swc/core@1.13.5(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': dependencies: - '@storybook/builder-webpack5': 8.6.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) - '@storybook/preset-react-webpack': 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(@swc/core@1.13.5(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) + '@storybook/builder-webpack5': 8.6.14(@swc/core@1.13.5(@swc/helpers@0.5.17))(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) + '@storybook/preset-react-webpack': 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(@swc/core@1.13.5(@swc/helpers@0.5.17))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) + '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -10886,45 +10886,45 @@ snapshots: - uglify-js - webpack-cli - '@storybook/react@8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': + '@storybook/react@8.6.14(@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': dependencies: - '@storybook/components': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/components': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/preview-api': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/react-dom-shim': 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) - '@storybook/theming': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/manager-api': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/preview-api': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/react-dom-shim': 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/theming': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) optionalDependencies: - '@storybook/test': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/test': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) typescript: 5.8.3 - '@storybook/react@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': + '@storybook/react@9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))(typescript@5.8.3)': dependencies: '@storybook/global': 5.0.0 - '@storybook/react-dom-shim': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/react-dom-shim': 9.1.10(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) optionalDependencies: typescript: 5.8.3 - '@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/test@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) + '@storybook/instrumenter': 8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))) '@testing-library/dom': 10.4.0 '@testing-library/jest-dom': 6.5.0 '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) '@vitest/expect': 2.0.5 '@vitest/spy': 2.0.5 - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - '@storybook/theming@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': + '@storybook/theming@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: - storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) '@swc/core-darwin-arm64@1.13.5': optional: true @@ -11678,21 +11678,21 @@ snapshots: chai: 6.2.1 tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': + '@vitest/mocker@3.2.4(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) - '@vitest/mocker@4.0.15(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': + '@vitest/mocker@4.0.15(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.0.15 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) '@vitest/pretty-format@2.0.5': dependencies: @@ -15771,13 +15771,13 @@ snapshots: std-env@3.10.0: {} - storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)): + storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)): dependencies: '@storybook/global': 5.0.0 '@testing-library/jest-dom': 6.9.1 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + '@vitest/mocker': 3.2.4(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) '@vitest/spy': 3.2.4 better-opn: 3.0.2 esbuild: 0.25.0 @@ -16324,7 +16324,7 @@ snapshots: debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) transitivePeerDependencies: - '@types/node' - jiti @@ -16339,18 +16339,18 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.3) optionalDependencies: - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) transitivePeerDependencies: - supports-color - typescript - vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3): + vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3): dependencies: esbuild: 0.25.0 fdir: 6.5.0(picomatch@2.3.2) @@ -16369,7 +16369,7 @@ snapshots: vitest@4.0.15(@opentelemetry/api@1.9.0)(@types/node@22.12.0)(jiti@2.6.1)(jsdom@26.1.0)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3): dependencies: '@vitest/expect': 4.0.15 - '@vitest/mocker': 4.0.15(vite@7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) + '@vitest/mocker': 4.0.15(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) '@vitest/pretty-format': 4.0.15 '@vitest/runner': 4.0.15 '@vitest/snapshot': 4.0.15 @@ -16386,7 +16386,7 @@ snapshots: tinyexec: 1.0.4 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) + vite: 7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index b20c3be19de..7e9519830e6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -33,7 +33,7 @@ catalog: tsdown: 0.16.0 typescript: 5.8.3 uuid: 13.0.0 - vite: 7.3.1 + vite: 7.3.2 onlyBuiltDependencies: - turbo From 7c2fc2dd7f8f02ce16cac3f126871c98b614773f Mon Sep 17 00:00:00 2001 From: Niels Kaspers <153818647+nielskaspers@users.noreply.github.com> Date: Tue, 7 Apr 2026 13:04:54 +0300 Subject: [PATCH 02/21] fix: update Twitter icon and links to X (#8785) (#8790) --- README.md | 2 +- apps/api/templates/emails/invitations/project_invitation.html | 2 +- apps/api/templates/emails/notifications/issue-updates.html | 2 +- .../templates/emails/notifications/webhook-deactivate.html | 4 ++-- apps/api/templates/emails/user/email_updated.html | 2 +- apps/api/templates/emails/user/user_activation.html | 4 ++-- apps/api/templates/emails/user/user_deactivation.html | 4 ++-- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index d2117149da6..74688cd92c4 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@

WebsiteForum • - Twitter • + XDocumentation

diff --git a/apps/api/templates/emails/invitations/project_invitation.html b/apps/api/templates/emails/invitations/project_invitation.html index 36aecd60d82..f18579c6459 100644 --- a/apps/api/templates/emails/invitations/project_invitation.html +++ b/apps/api/templates/emails/invitations/project_invitation.html @@ -261,7 +261,7 @@ ­ - + ­ diff --git a/apps/api/templates/emails/notifications/issue-updates.html b/apps/api/templates/emails/notifications/issue-updates.html index c6fe3b2786c..d82614ded61 100644 --- a/apps/api/templates/emails/notifications/issue-updates.html +++ b/apps/api/templates/emails/notifications/issue-updates.html @@ -233,7 +233,7 @@
This email was sent to {{ receiver.email }}. If you'd rather not receive this kind of email, you can unsubscribe to the {{entity_type}} or manage your email preferences. -
+
diff --git a/apps/api/templates/emails/notifications/webhook-deactivate.html b/apps/api/templates/emails/notifications/webhook-deactivate.html index 44aca67203a..c094eaa7636 100644 --- a/apps/api/templates/emails/notifications/webhook-deactivate.html +++ b/apps/api/templates/emails/notifications/webhook-deactivate.html @@ -155,7 +155,7 @@ ­
-

Despite our popularity, we are humbly early-stage. We are shipping fast, so please reach out to us with feature requests, major and minor nits, and anything else you find missing. We read every message, tweet, and conversation and update our public roadmap.

+

Despite our popularity, we are humbly early-stage. We are shipping fast, so please reach out to us with feature requests, major and minor nits, and anything else you find missing. We read every message, tweet, and conversation and update our public roadmap.

­ @@ -220,7 +220,7 @@ - + diff --git a/apps/api/templates/emails/user/email_updated.html b/apps/api/templates/emails/user/email_updated.html index cd13347ead2..cb1cad45966 100644 --- a/apps/api/templates/emails/user/email_updated.html +++ b/apps/api/templates/emails/user/email_updated.html @@ -831,7 +831,7 @@ " > , , Date: Wed, 8 Apr 2026 16:06:52 +0530 Subject: [PATCH 04/21] fix: strip whitespace and handle null values in instance configuration (#8744) When patching instance configuration values, the raw values from request.data were used directly without sanitization. This adds: - Whitespace stripping via str().strip() to prevent leading/trailing spaces from being stored - Explicit None handling so that null values become empty strings instead of the literal string "None" --- apps/api/plane/license/api/views/configuration.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/api/plane/license/api/views/configuration.py b/apps/api/plane/license/api/views/configuration.py index bb9a9e00ee6..c5ad5f5788b 100644 --- a/apps/api/plane/license/api/views/configuration.py +++ b/apps/api/plane/license/api/views/configuration.py @@ -45,7 +45,8 @@ def patch(self, request): bulk_configurations = [] for configuration in configurations: - value = request.data.get(configuration.key, configuration.value) + raw_value = request.data.get(configuration.key, configuration.value) + value = "" if raw_value is None else str(raw_value).strip() if configuration.is_encrypted: configuration.value = encrypt_data(value) else: From 6023e8cfc81cc272279d126c6384464b18dc7722 Mon Sep 17 00:00:00 2001 From: b-saikrishnakanth <130811169+b-saikrishnakanth@users.noreply.github.com> Date: Thu, 9 Apr 2026 21:30:15 +0530 Subject: [PATCH 05/21] [WEB-6784] feat scrollbar in shortcuts modal (#8872) * fix: update border for project timezone * feat: added scrollbar in keyboard shortcuts modal * fix: remove unnecessary changes * fix: remove redundant overflow --- .../power-k/ui/modal/shortcuts-root.tsx | 38 +++++++++++-------- .../power-k/ui/renderer/shortcut.tsx | 2 +- 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/apps/web/core/components/power-k/ui/modal/shortcuts-root.tsx b/apps/web/core/components/power-k/ui/modal/shortcuts-root.tsx index 50b0e305098..acf392350cd 100644 --- a/apps/web/core/components/power-k/ui/modal/shortcuts-root.tsx +++ b/apps/web/core/components/power-k/ui/modal/shortcuts-root.tsx @@ -8,6 +8,7 @@ import { useState, Fragment } from "react"; import { Dialog, Transition } from "@headlessui/react"; // plane imports import { CloseIcon, SearchIcon } from "@plane/propel/icons"; +import { ScrollArea } from "@plane/propel/scrollarea"; import { Input } from "@plane/ui"; // hooks import { usePowerK } from "@/hooks/store/use-power-k"; @@ -61,28 +62,33 @@ export function ShortcutsModal(props: Props) { leaveTo="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95" > -
- +
+ Keyboard shortcuts -
- - setQuery(e.target.value)} - placeholder="Search for shortcuts" - className="w-full border-none bg-transparent py-1 text-11 text-secondary outline-none" - autoFocus - tabIndex={1} - /> +
+
+ + setQuery(e.target.value)} + placeholder="Search for shortcuts" + className="w-full border-none bg-transparent py-1 text-11 text-secondary outline-none" + autoFocus + tabIndex={1} + /> +
- + + + +
diff --git a/apps/web/core/components/power-k/ui/renderer/shortcut.tsx b/apps/web/core/components/power-k/ui/renderer/shortcut.tsx index c2a9f04cf6d..9f4d5098430 100644 --- a/apps/web/core/components/power-k/ui/renderer/shortcut.tsx +++ b/apps/web/core/components/power-k/ui/renderer/shortcut.tsx @@ -78,7 +78,7 @@ export function ShortcutRenderer(props: Props) { const isShortcutsEmpty = groupedCommands.length === 0; return ( -
+
{!isShortcutsEmpty ? ( groupedCommands.map((group) => (
From e6b9d4c9bae58d1a932634ee2014c2c6ae0c9651 Mon Sep 17 00:00:00 2001 From: b-saikrishnakanth <130811169+b-saikrishnakanth@users.noreply.github.com> Date: Thu, 9 Apr 2026 21:30:48 +0530 Subject: [PATCH 06/21] [WEB-6785] fix: update border for project timezone (#8870) --- apps/web/core/components/project/form.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/core/components/project/form.tsx b/apps/web/core/components/project/form.tsx index b14b63cd61f..2d7575436f3 100644 --- a/apps/web/core/components/project/form.tsx +++ b/apps/web/core/components/project/form.tsx @@ -418,7 +418,7 @@ export function ProjectDetailsForm(props: IProjectDetailsForm) { onChange(value); }} error={Boolean(errors.timezone)} - buttonClassName="border-none" + buttonClassName="!border-subtle !shadow-none font-medium rounded-md" disabled={!isAdmin} /> From c21d2c6fb35fd93b2ddab5edf20a017bd12fef4a Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Fri, 10 Apr 2026 00:16:45 +0530 Subject: [PATCH 07/21] chore: remove Intercom integration and chat support components (#8875) Intercom is no longer used. This removes all related frontend components, hooks, custom events, API config, types, and i18n keys. --- .../app/(all)/(dashboard)/general/form.tsx | 19 +--- .../(all)/(dashboard)/general/intercom.tsx | 86 ------------------- apps/api/plane/license/api/views/instance.py | 15 ---- .../utils/instance_config_variables/core.py | 16 ---- .../power-k/config/help-commands.ts | 13 --- .../workspace/sidebar/help-section/root.tsx | 16 +--- apps/web/core/custom-events/chat-support.ts | 19 ---- apps/web/core/hooks/use-chat-support.ts | 31 ------- packages/i18n/src/locales/cs/translations.ts | 1 - packages/i18n/src/locales/de/translations.ts | 1 - packages/i18n/src/locales/en/translations.ts | 2 - packages/i18n/src/locales/es/translations.ts | 1 - packages/i18n/src/locales/fr/translations.ts | 1 - packages/i18n/src/locales/id/translations.ts | 1 - packages/i18n/src/locales/it/translations.ts | 1 - packages/i18n/src/locales/ja/translations.ts | 1 - packages/i18n/src/locales/ko/translations.ts | 1 - packages/i18n/src/locales/pl/translations.ts | 1 - .../i18n/src/locales/pt-BR/translations.ts | 1 - packages/i18n/src/locales/ro/translations.ts | 1 - packages/i18n/src/locales/ru/translations.ts | 2 - packages/i18n/src/locales/sk/translations.ts | 1 - .../i18n/src/locales/tr-TR/translations.ts | 1 - packages/i18n/src/locales/ua/translations.ts | 2 - .../i18n/src/locales/vi-VN/translations.ts | 1 - .../i18n/src/locales/zh-CN/translations.ts | 1 - .../i18n/src/locales/zh-TW/translations.ts | 1 - packages/types/src/instance/base.ts | 6 -- 28 files changed, 3 insertions(+), 240 deletions(-) delete mode 100644 apps/admin/app/(all)/(dashboard)/general/intercom.tsx delete mode 100644 apps/web/core/custom-events/chat-support.ts delete mode 100644 apps/web/core/hooks/use-chat-support.ts diff --git a/apps/admin/app/(all)/(dashboard)/general/form.tsx b/apps/admin/app/(all)/(dashboard)/general/form.tsx index 0b402b76c7a..e38d7848eb7 100644 --- a/apps/admin/app/(all)/(dashboard)/general/form.tsx +++ b/apps/admin/app/(all)/(dashboard)/general/form.tsx @@ -16,8 +16,6 @@ import { Input, ToggleSwitch } from "@plane/ui"; import { ControllerInput } from "@/components/common/controller-input"; // hooks import { useInstance } from "@/hooks/store"; -// components -import { IntercomConfig } from "./intercom"; export interface IGeneralConfigurationForm { instance: IInstance; @@ -27,14 +25,13 @@ export interface IGeneralConfigurationForm { export const GeneralConfigurationForm = observer(function GeneralConfigurationForm(props: IGeneralConfigurationForm) { const { instance, instanceAdmins } = props; // hooks - const { instanceConfigurations, updateInstanceInfo, updateInstanceConfigurations } = useInstance(); + const { updateInstanceInfo } = useInstance(); // form data const { handleSubmit, control, formState: { errors, isSubmitting }, - watch, } = useForm>({ defaultValues: { instance_name: instance?.instance_name, @@ -45,17 +42,6 @@ export const GeneralConfigurationForm = observer(function GeneralConfigurationFo const onSubmit = async (formData: Partial) => { const payload: Partial = { ...formData }; - // update the intercom configuration - const isIntercomEnabled = - instanceConfigurations?.find((config) => config.key === "IS_INTERCOM_ENABLED")?.value === "1"; - if (!payload.is_telemetry_enabled && isIntercomEnabled) { - try { - await updateInstanceConfigurations({ IS_INTERCOM_ENABLED: "0" }); - } catch (error) { - console.error(error); - } - } - await updateInstanceInfo(payload) .then(() => setToast({ @@ -112,8 +98,7 @@ export const GeneralConfigurationForm = observer(function GeneralConfigurationFo
-
Chat + telemetry
- +
Telemetry
diff --git a/apps/admin/app/(all)/(dashboard)/general/intercom.tsx b/apps/admin/app/(all)/(dashboard)/general/intercom.tsx deleted file mode 100644 index 656e2d69022..00000000000 --- a/apps/admin/app/(all)/(dashboard)/general/intercom.tsx +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -import { useState } from "react"; -import { observer } from "mobx-react"; -import useSWR from "swr"; -import { MessageSquare } from "lucide-react"; -import type { IFormattedInstanceConfiguration } from "@plane/types"; -import { ToggleSwitch } from "@plane/ui"; -// hooks -import { useInstance } from "@/hooks/store"; - -type TIntercomConfig = { - isTelemetryEnabled: boolean; -}; - -export const IntercomConfig = observer(function IntercomConfig(props: TIntercomConfig) { - const { isTelemetryEnabled } = props; - // hooks - const { instanceConfigurations, updateInstanceConfigurations, fetchInstanceConfigurations } = useInstance(); - // states - const [isSubmitting, setIsSubmitting] = useState(false); - - // derived values - const isIntercomEnabled = isTelemetryEnabled - ? instanceConfigurations - ? instanceConfigurations?.find((config) => config.key === "IS_INTERCOM_ENABLED")?.value === "1" - ? true - : false - : undefined - : false; - - const { isLoading } = useSWR(isTelemetryEnabled ? "INSTANCE_CONFIGURATIONS" : null, () => - isTelemetryEnabled ? fetchInstanceConfigurations() : null - ); - - const initialLoader = isLoading && isIntercomEnabled === undefined; - - const submitInstanceConfigurations = async (payload: Partial) => { - try { - await updateInstanceConfigurations(payload); - } catch (error) { - console.error(error); - } finally { - setIsSubmitting(false); - } - }; - - const enableIntercomConfig = () => { - void submitInstanceConfigurations({ IS_INTERCOM_ENABLED: isIntercomEnabled ? "0" : "1" }); - }; - - return ( - <> -
-
-
-
- -
-
- -
-
Chat with us
-
- Let your users chat with us via Intercom or another service. Toggling Telemetry off turns this off - automatically. -
-
- -
- -
-
-
- - ); -}); diff --git a/apps/api/plane/license/api/views/instance.py b/apps/api/plane/license/api/views/instance.py index a0d52d4912f..29c2521abd8 100644 --- a/apps/api/plane/license/api/views/instance.py +++ b/apps/api/plane/license/api/views/instance.py @@ -63,8 +63,6 @@ def get(self, request): POSTHOG_HOST, UNSPLASH_ACCESS_KEY, LLM_API_KEY, - IS_INTERCOM_ENABLED, - INTERCOM_APP_ID, ) = get_configuration_value( [ { @@ -124,15 +122,6 @@ def get(self, request): "key": "LLM_API_KEY", "default": os.environ.get("LLM_API_KEY", ""), }, - # Intercom settings - { - "key": "IS_INTERCOM_ENABLED", - "default": os.environ.get("IS_INTERCOM_ENABLED", "1"), - }, - { - "key": "INTERCOM_APP_ID", - "default": os.environ.get("INTERCOM_APP_ID", ""), - }, ] ) @@ -169,10 +158,6 @@ def get(self, request): # is smtp configured data["is_smtp_configured"] = bool(EMAIL_HOST) - # Intercom settings - data["is_intercom_enabled"] = IS_INTERCOM_ENABLED == "1" - data["intercom_app_id"] = INTERCOM_APP_ID - # Base URL data["admin_base_url"] = settings.ADMIN_BASE_URL data["space_base_url"] = settings.SPACE_BASE_URL diff --git a/apps/api/plane/utils/instance_config_variables/core.py b/apps/api/plane/utils/instance_config_variables/core.py index 274c6539af9..6eebf0b3adb 100644 --- a/apps/api/plane/utils/instance_config_variables/core.py +++ b/apps/api/plane/utils/instance_config_variables/core.py @@ -232,21 +232,6 @@ }, ] -intercom_config_variables = [ - { - "key": "IS_INTERCOM_ENABLED", - "value": os.environ.get("IS_INTERCOM_ENABLED", "1"), - "category": "INTERCOM", - "is_encrypted": False, - }, - { - "key": "INTERCOM_APP_ID", - "value": os.environ.get("INTERCOM_APP_ID", ""), - "category": "INTERCOM", - "is_encrypted": False, - }, -] - core_config_variables = [ *authentication_config_variables, *workspace_management_config_variables, @@ -257,5 +242,4 @@ *smtp_config_variables, *llm_config_variables, *unsplash_config_variables, - *intercom_config_variables, ] diff --git a/apps/web/core/components/power-k/config/help-commands.ts b/apps/web/core/components/power-k/config/help-commands.ts index 0543e6698df..79e47354d56 100644 --- a/apps/web/core/components/power-k/config/help-commands.ts +++ b/apps/web/core/components/power-k/config/help-commands.ts @@ -9,7 +9,6 @@ import { FileText, GithubIcon, MessageSquare, Rocket } from "lucide-react"; import type { TPowerKCommandConfig } from "@/components/power-k/core/types"; // hooks import { usePowerK } from "@/hooks/store/use-power-k"; -import { useChatSupport } from "@/hooks/use-chat-support"; /** * Help commands - Help related commands @@ -17,7 +16,6 @@ import { useChatSupport } from "@/hooks/use-chat-support"; export const usePowerKHelpCommands = (): TPowerKCommandConfig[] => { // store const { toggleShortcutsListModal } = usePowerK(); - const { isEnabled: isChatSupportEnabled, openChatSupport } = useChatSupport(); return [ { @@ -71,16 +69,5 @@ export const usePowerKHelpCommands = (): TPowerKCommandConfig[] => { isVisible: () => true, closeOnSelect: true, }, - { - id: "chat_with_us", - type: "action", - group: "help", - i18n_title: "power_k.help_actions.chat_with_us", - icon: MessageSquare, - action: () => openChatSupport(), - isEnabled: () => isChatSupportEnabled, - isVisible: () => isChatSupportEnabled, - closeOnSelect: true, - }, ]; }; diff --git a/apps/web/core/components/workspace/sidebar/help-section/root.tsx b/apps/web/core/components/workspace/sidebar/help-section/root.tsx index dea70d90aec..48cd1898a6e 100644 --- a/apps/web/core/components/workspace/sidebar/help-section/root.tsx +++ b/apps/web/core/components/workspace/sidebar/help-section/root.tsx @@ -6,7 +6,7 @@ import React, { useState } from "react"; import { observer } from "mobx-react"; -import { HelpCircle, MessagesSquare, User } from "lucide-react"; +import { HelpCircle, User } from "lucide-react"; import { useTranslation } from "@plane/i18n"; import { PageIcon } from "@plane/propel/icons"; // ui @@ -16,7 +16,6 @@ import { ProductUpdatesModal } from "@/components/global"; import { AppSidebarItem } from "@/components/sidebar/sidebar-item"; // hooks import { usePowerK } from "@/hooks/store/use-power-k"; -import { useChatSupport } from "@/hooks/use-chat-support"; // plane web components import { PlaneVersionNumber } from "@/plane-web/components/global"; @@ -24,7 +23,6 @@ export const HelpMenuRoot = observer(function HelpMenuRoot() { // store hooks const { t } = useTranslation(); const { toggleShortcutsListModal } = usePowerK(); - const { openChatSupport, isEnabled: isChatSupportEnabled } = useChatSupport(); // states const [isNeedHelpOpen, setIsNeedHelpOpen] = useState(false); const [isProductUpdatesModalOpen, setProductUpdatesModalOpen] = useState(false); @@ -56,18 +54,6 @@ export const HelpMenuRoot = observer(function HelpMenuRoot() { {t("documentation")}
- {isChatSupportEnabled && ( - - - - )} window.open("mailto:sales@plane.so", "_blank")}>
diff --git a/apps/web/core/custom-events/chat-support.ts b/apps/web/core/custom-events/chat-support.ts deleted file mode 100644 index 8c7d0fa5c35..00000000000 --- a/apps/web/core/custom-events/chat-support.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -type ChatSupportType = "open"; - -type ChatSupportEventType = `chat-support:${ChatSupportType}`; - -export const CHAT_SUPPORT_EVENTS = { - open: "chat-support:open", -} satisfies Record; - -export class ChatSupportEvent extends CustomEvent { - constructor(type: ChatSupportType) { - super(CHAT_SUPPORT_EVENTS[type]); - } -} diff --git a/apps/web/core/hooks/use-chat-support.ts b/apps/web/core/hooks/use-chat-support.ts deleted file mode 100644 index b4e3e70a0cb..00000000000 --- a/apps/web/core/hooks/use-chat-support.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright (c) 2023-present Plane Software, Inc. and contributors - * SPDX-License-Identifier: AGPL-3.0-only - * See the LICENSE file for details. - */ - -import { useCallback } from "react"; -// custom events -import { ChatSupportEvent } from "@/custom-events/chat-support"; -// hooks -import { useInstance } from "@/hooks/store/use-instance"; -import { useUser } from "@/hooks/store/user"; - -export interface IUseChatSupport { - openChatSupport: () => void; - isEnabled: boolean; -} - -export const useChatSupport = (): IUseChatSupport => { - const { data: user } = useUser(); - const { config } = useInstance(); - // derived values - const isEnabled = Boolean(user && config?.is_intercom_enabled && config?.intercom_app_id); - - const openChatSupport = useCallback(() => { - if (!isEnabled) return; - window.dispatchEvent(new ChatSupportEvent("open")); - }, [isEnabled]); - - return { openChatSupport, isEnabled }; -}; diff --git a/packages/i18n/src/locales/cs/translations.ts b/packages/i18n/src/locales/cs/translations.ts index 8a0aded99bd..d2a818f3b89 100644 --- a/packages/i18n/src/locales/cs/translations.ts +++ b/packages/i18n/src/locales/cs/translations.ts @@ -395,7 +395,6 @@ export default { time_tracking_description: "Zaznamenávejte čas strávený na pracovních položkách a projektech.", work_management_description: "Spravujte svou práci a projekty snadno.", documentation: "Dokumentace", - message_support: "Kontaktovat podporu", contact_sales: "Kontaktovat prodej", hyper_mode: "Hyper režim", keyboard_shortcuts: "Klávesové zkratky", diff --git a/packages/i18n/src/locales/de/translations.ts b/packages/i18n/src/locales/de/translations.ts index 2d54b10b85a..db4925f1f92 100644 --- a/packages/i18n/src/locales/de/translations.ts +++ b/packages/i18n/src/locales/de/translations.ts @@ -406,7 +406,6 @@ export default { time_tracking_description: "Erfassen Sie die auf Arbeitselemente und Projekte verwendete Zeit.", work_management_description: "Verwalten Sie Ihre Arbeit und Projekte mühelos.", documentation: "Dokumentation", - message_support: "Support kontaktieren", contact_sales: "Vertrieb kontaktieren", hyper_mode: "Hyper-Modus", keyboard_shortcuts: "Tastaturkürzel", diff --git a/packages/i18n/src/locales/en/translations.ts b/packages/i18n/src/locales/en/translations.ts index 9f3eff04d1a..2885fd3f0a1 100644 --- a/packages/i18n/src/locales/en/translations.ts +++ b/packages/i18n/src/locales/en/translations.ts @@ -229,7 +229,6 @@ export default { time_tracking_description: "Log time spent on work items and projects.", work_management_description: "Manage your work and projects with ease.", documentation: "Documentation", - message_support: "Message support", contact_sales: "Contact sales", hyper_mode: "Hyper Mode", keyboard_shortcuts: "Keyboard shortcuts", @@ -2697,7 +2696,6 @@ export default { open_plane_documentation: "Open Plane documentation", join_forum: "Join our Forum", report_bug: "Report a bug", - chat_with_us: "Chat with us", }, page_placeholders: { default: "Type a command or search", diff --git a/packages/i18n/src/locales/es/translations.ts b/packages/i18n/src/locales/es/translations.ts index 0d25038f17b..5ed015d06ca 100644 --- a/packages/i18n/src/locales/es/translations.ts +++ b/packages/i18n/src/locales/es/translations.ts @@ -406,7 +406,6 @@ export default { time_tracking_description: "Registra el tiempo dedicado a elementos de trabajo y proyectos.", work_management_description: "Gestiona tu trabajo y proyectos con facilidad.", documentation: "Documentación", - message_support: "Mensaje al soporte", contact_sales: "Contactar ventas", hyper_mode: "Modo Hyper", keyboard_shortcuts: "Atajos de teclado", diff --git a/packages/i18n/src/locales/fr/translations.ts b/packages/i18n/src/locales/fr/translations.ts index 38ef528359e..f7ace4c6914 100644 --- a/packages/i18n/src/locales/fr/translations.ts +++ b/packages/i18n/src/locales/fr/translations.ts @@ -402,7 +402,6 @@ export default { time_tracking_description: "Enregistrez le temps passé sur les éléments de travail et les projets.", work_management_description: "Gérez votre travail et vos projets facilement.", documentation: "Documentation", - message_support: "Contacter le support", contact_sales: "Contacter les ventes", hyper_mode: "Mode Hyper", keyboard_shortcuts: "Raccourcis clavier", diff --git a/packages/i18n/src/locales/id/translations.ts b/packages/i18n/src/locales/id/translations.ts index dfe4e198dd3..f933b215e04 100644 --- a/packages/i18n/src/locales/id/translations.ts +++ b/packages/i18n/src/locales/id/translations.ts @@ -398,7 +398,6 @@ export default { time_tracking_description: "Catat waktu yang dihabiskan untuk item kerja dan proyek.", work_management_description: "Kelola pekerjaan dan proyek Anda dengan mudah.", documentation: "Dokumentasi", - message_support: "Pesan dukungan", contact_sales: "Hubungi penjualan", hyper_mode: "Mode Hyper", keyboard_shortcuts: "Pintasan keyboard", diff --git a/packages/i18n/src/locales/it/translations.ts b/packages/i18n/src/locales/it/translations.ts index 247a0edee38..a0cb1b5c54f 100644 --- a/packages/i18n/src/locales/it/translations.ts +++ b/packages/i18n/src/locales/it/translations.ts @@ -400,7 +400,6 @@ export default { time_tracking_description: "Registra il tempo trascorso su elementi di lavoro e progetti.", work_management_description: "Gestisci il tuo lavoro e i tuoi progetti con facilità.", documentation: "Documentazione", - message_support: "Contatta il supporto", contact_sales: "Contatta le vendite", hyper_mode: "Modalità Hyper", keyboard_shortcuts: "Scorciatoie da tastiera", diff --git a/packages/i18n/src/locales/ja/translations.ts b/packages/i18n/src/locales/ja/translations.ts index 513d5e13293..6d79979904e 100644 --- a/packages/i18n/src/locales/ja/translations.ts +++ b/packages/i18n/src/locales/ja/translations.ts @@ -395,7 +395,6 @@ export default { time_tracking_description: "作業項目やプロジェクトに費やした時間を記録します。", work_management_description: "作業とプロジェクトを簡単に管理します。", documentation: "ドキュメント", - message_support: "サポートにメッセージ", contact_sales: "営業に問い合わせ", hyper_mode: "Hyper Mode", keyboard_shortcuts: "キーボードショートカット", diff --git a/packages/i18n/src/locales/ko/translations.ts b/packages/i18n/src/locales/ko/translations.ts index 5f86903d6ba..cf7e68d36a2 100644 --- a/packages/i18n/src/locales/ko/translations.ts +++ b/packages/i18n/src/locales/ko/translations.ts @@ -390,7 +390,6 @@ export default { time_tracking_description: "작업 항목 및 프로젝트에 소요된 시간을 기록하세요.", work_management_description: "작업 및 프로젝트를 쉽게 관리합니다.", documentation: "문서", - message_support: "지원 메시지", contact_sales: "영업 문의", hyper_mode: "하이퍼 모드", keyboard_shortcuts: "키보드 단축키", diff --git a/packages/i18n/src/locales/pl/translations.ts b/packages/i18n/src/locales/pl/translations.ts index fab1b96e85e..225859e9635 100644 --- a/packages/i18n/src/locales/pl/translations.ts +++ b/packages/i18n/src/locales/pl/translations.ts @@ -393,7 +393,6 @@ export default { time_tracking_description: "Rejestruj czas spędzony na elementach pracy i projektach.", work_management_description: "Łatwo zarządzaj swoją pracą i projektami.", documentation: "Dokumentacja", - message_support: "Skontaktuj się z pomocą", contact_sales: "Skontaktuj się z działem sprzedaży", hyper_mode: "Tryb Hyper", keyboard_shortcuts: "Skróty klawiaturowe", diff --git a/packages/i18n/src/locales/pt-BR/translations.ts b/packages/i18n/src/locales/pt-BR/translations.ts index 31b17890e0a..5282692a17b 100644 --- a/packages/i18n/src/locales/pt-BR/translations.ts +++ b/packages/i18n/src/locales/pt-BR/translations.ts @@ -402,7 +402,6 @@ export default { time_tracking_description: "Registre o tempo gasto em itens de trabalho e projetos.", work_management_description: "Gerencie seu trabalho e projetos com facilidade.", documentation: "Documentação", - message_support: "Suporte por mensagem", contact_sales: "Contatar vendas", hyper_mode: "Modo Hyper", keyboard_shortcuts: "Atalhos do teclado", diff --git a/packages/i18n/src/locales/ro/translations.ts b/packages/i18n/src/locales/ro/translations.ts index be20aa144fd..09a3312b6c8 100644 --- a/packages/i18n/src/locales/ro/translations.ts +++ b/packages/i18n/src/locales/ro/translations.ts @@ -399,7 +399,6 @@ export default { time_tracking_description: "Înregistrează timpul petrecut pe activități și proiecte.", work_management_description: "Gestionează-ți munca și proiectele cu ușurință.", documentation: "Documentație", - message_support: "Trimite mesaj la suport", contact_sales: "Contactează vânzările", hyper_mode: "Mod Hyper", keyboard_shortcuts: "Scurtături tastatură", diff --git a/packages/i18n/src/locales/ru/translations.ts b/packages/i18n/src/locales/ru/translations.ts index cbaa0081d00..52024d06cd1 100644 --- a/packages/i18n/src/locales/ru/translations.ts +++ b/packages/i18n/src/locales/ru/translations.ts @@ -402,7 +402,6 @@ export default { time_tracking_description: "Записывайте время, потраченное на рабочие элементы и проекты.", work_management_description: "Управление рабочими элементами и проектами", documentation: "Документация", - message_support: "Написать в поддержку", contact_sales: "Связаться с отделом продаж", hyper_mode: "Гиперрежим", keyboard_shortcuts: "Горячие клавиши", @@ -2869,7 +2868,6 @@ export default { open_plane_documentation: "Открыть документацию Plane", join_forum: "Присоединиться к Forum", report_bug: "Сообщить об ошибке", - chat_with_us: "Написать нам", }, page_placeholders: { default: "Введите команду или поиск", diff --git a/packages/i18n/src/locales/sk/translations.ts b/packages/i18n/src/locales/sk/translations.ts index 9d9343d0030..9a0c42e8e9e 100644 --- a/packages/i18n/src/locales/sk/translations.ts +++ b/packages/i18n/src/locales/sk/translations.ts @@ -395,7 +395,6 @@ export default { time_tracking_description: "Zaznamenajte čas strávený na pracovných položkách a projektoch.", work_management_description: "Spravujte svoju prácu a projekty jednoducho.", documentation: "Dokumentácia", - message_support: "Kontaktovať podporu", contact_sales: "Kontaktovať predaj", hyper_mode: "Hyper režim", keyboard_shortcuts: "Klávesové skratky", diff --git a/packages/i18n/src/locales/tr-TR/translations.ts b/packages/i18n/src/locales/tr-TR/translations.ts index 4b1240fba44..4e60e0cfbec 100644 --- a/packages/i18n/src/locales/tr-TR/translations.ts +++ b/packages/i18n/src/locales/tr-TR/translations.ts @@ -396,7 +396,6 @@ export default { time_tracking_description: "İş öğeleri ve projelerde harcanan zamanı kaydedin.", work_management_description: "İşlerinizi ve projelerinizi kolayca yönetin.", documentation: "Dokümantasyon", - message_support: "Destekle iletişim", contact_sales: "Satış Ekibiyle İletişim", hyper_mode: "Hiper Mod", keyboard_shortcuts: "Klavye Kısayolları", diff --git a/packages/i18n/src/locales/ua/translations.ts b/packages/i18n/src/locales/ua/translations.ts index 1da89e4a65d..0c949cf0567 100644 --- a/packages/i18n/src/locales/ua/translations.ts +++ b/packages/i18n/src/locales/ua/translations.ts @@ -402,7 +402,6 @@ export default { time_tracking_description: "Фіксуйте час, витрачений на робочі одиниці та проєкти.", work_management_description: "Зручно керуйте своєю роботою та проєктами.", documentation: "Документація", - message_support: "Звернутися в підтримку", contact_sales: "Зв’язатися з відділом продажів", hyper_mode: "Гіпер-режим", keyboard_shortcuts: "Гарячі клавіші", @@ -2861,7 +2860,6 @@ export default { open_plane_documentation: "Відкрити документацію Plane", join_forum: "Приєднатися до Forum", report_bug: "Повідомити про помилку", - chat_with_us: "Написати нам", }, page_placeholders: { default: "Введіть команду або виконайте пошук", diff --git a/packages/i18n/src/locales/vi-VN/translations.ts b/packages/i18n/src/locales/vi-VN/translations.ts index 62036fbe8ca..0cc12c75ea0 100644 --- a/packages/i18n/src/locales/vi-VN/translations.ts +++ b/packages/i18n/src/locales/vi-VN/translations.ts @@ -399,7 +399,6 @@ export default { time_tracking_description: "Ghi lại thời gian dành cho các mục công việc và dự án.", work_management_description: "Quản lý công việc và dự án của bạn một cách dễ dàng.", documentation: "Tài liệu", - message_support: "Liên hệ hỗ trợ", contact_sales: "Liên hệ bộ phận bán hàng", hyper_mode: "Chế độ siêu tốc", keyboard_shortcuts: "Phím tắt", diff --git a/packages/i18n/src/locales/zh-CN/translations.ts b/packages/i18n/src/locales/zh-CN/translations.ts index 9963936a36e..585ae13aa68 100644 --- a/packages/i18n/src/locales/zh-CN/translations.ts +++ b/packages/i18n/src/locales/zh-CN/translations.ts @@ -385,7 +385,6 @@ export default { time_tracking_description: "记录在工作项和项目上花费的时间。", work_management_description: "轻松管理您的工作和项目。", documentation: "文档", - message_support: "联系支持", contact_sales: "联系销售", hyper_mode: "超级模式", keyboard_shortcuts: "键盘快捷键", diff --git a/packages/i18n/src/locales/zh-TW/translations.ts b/packages/i18n/src/locales/zh-TW/translations.ts index e65359c4867..1fcf528fb1d 100644 --- a/packages/i18n/src/locales/zh-TW/translations.ts +++ b/packages/i18n/src/locales/zh-TW/translations.ts @@ -384,7 +384,6 @@ export default { time_tracking_description: "記錄在工作事項和專案上花費的時間。", work_management_description: "輕鬆管理您的工作和專案。", documentation: "文件", - message_support: "聯絡支援", contact_sales: "聯絡業務", hyper_mode: "極速模式", keyboard_shortcuts: "鍵盤快速鍵", diff --git a/packages/types/src/instance/base.ts b/packages/types/src/instance/base.ts index 431b09ac0f3..a93baef524f 100644 --- a/packages/types/src/instance/base.ts +++ b/packages/types/src/instance/base.ts @@ -65,9 +65,6 @@ export interface IInstanceConfig { space_base_url: string | undefined; admin_base_url: string | undefined; is_self_managed: boolean; - // intercom - is_intercom_enabled: boolean; - intercom_app_id: string | undefined; instance_changelog_url?: string; } @@ -83,14 +80,11 @@ export interface IInstanceAdmin { user_detail: IUserLite; } -export type TInstanceIntercomConfigurationKeys = "IS_INTERCOM_ENABLED" | "INTERCOM_APP_ID"; - export type TInstanceConfigurationKeys = | TInstanceAIConfigurationKeys | TInstanceEmailConfigurationKeys | TInstanceImageConfigurationKeys | TInstanceAuthenticationKeys - | TInstanceIntercomConfigurationKeys | TInstanceWorkspaceConfigurationKeys; export interface IInstanceConfiguration { From 39325d28a68c4b5abd8bbe42116dc1d2c57eebdc Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Fri, 10 Apr 2026 01:13:02 +0530 Subject: [PATCH 08/21] chore: update dependencies (Django, cryptography, axios, lodash) (#8880) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: update dependencies (Django, cryptography, axios, lodash) - Django 4.2.29 → 4.2.30 - cryptography 46.0.6 → 46.0.7 - axios 1.13.5 → 1.15.0 - lodash 4.17.23 → 4.18.0 * chore: update lodash from 4.18.0 to 4.18.1 --- apps/api/requirements/base.txt | 4 +-- package.json | 2 +- pnpm-lock.yaml | 57 +++++++++++++++++----------------- pnpm-workspace.yaml | 2 +- 4 files changed, 33 insertions(+), 32 deletions(-) diff --git a/apps/api/requirements/base.txt b/apps/api/requirements/base.txt index 865590cb2eb..7778a71a353 100644 --- a/apps/api/requirements/base.txt +++ b/apps/api/requirements/base.txt @@ -1,7 +1,7 @@ # base requirements # django -Django==4.2.29 +Django==4.2.30 # rest framework djangorestframework==3.15.2 # postgres @@ -51,7 +51,7 @@ beautifulsoup4==4.12.3 # analytics posthog==3.5.0 # crypto -cryptography==46.0.6 +cryptography==46.0.7 # html validator lxml==6.0.0 # s3 diff --git a/package.json b/package.json index ec1fdbc00d1..7c0ce03f1e8 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "webpack": "5.104.1", "lodash-es": "catalog:", "@isaacs/brace-expansion": "5.0.1", - "lodash": "4.17.23", + "lodash": "4.18.1", "markdown-it": "14.1.1", "rollup": "4.59.0", "minimatch@3": "3.1.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a469bae0e3e..e0f2e9aa297 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,8 +46,8 @@ catalogs: specifier: 18.3.1 version: 18.3.1 axios: - specifier: 1.13.5 - version: 1.13.5 + specifier: 1.15.0 + version: 1.15.0 dotenv: specifier: 16.4.7 version: 16.4.7 @@ -105,7 +105,7 @@ overrides: webpack: 5.104.1 lodash-es: 4.18.0 '@isaacs/brace-expansion': 5.0.1 - lodash: 4.17.23 + lodash: 4.18.1 markdown-it: 14.1.1 rollup: 4.59.0 minimatch@3: 3.1.4 @@ -190,7 +190,7 @@ importers: version: 3.13.12 axios: specifier: 'catalog:' - version: 1.13.5 + version: 1.15.0 isbot: specifier: ^5.1.31 version: 5.1.31 @@ -317,7 +317,7 @@ importers: version: 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@3.6.6))(@tiptap/pm@3.6.6) axios: specifier: 'catalog:' - version: 1.13.5 + version: 1.15.0 compression: specifier: 1.8.1 version: 1.8.1 @@ -462,7 +462,7 @@ importers: version: 7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) axios: specifier: 'catalog:' - version: 1.13.5 + version: 1.15.0 clsx: specifier: ^2.0.0 version: 2.1.1 @@ -622,7 +622,7 @@ importers: version: 8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) axios: specifier: 'catalog:' - version: 1.13.5 + version: 1.15.0 clsx: specifier: ^2.0.0 version: 2.1.1 @@ -1190,7 +1190,7 @@ importers: version: link:../types axios: specifier: 'catalog:' - version: 1.13.5 + version: 1.15.0 file-type: specifier: ^21.3.1 version: 21.3.3 @@ -4740,8 +4740,8 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axios@1.13.5: - resolution: {integrity: sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==} + axios@1.15.0: + resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==} babel-dead-code-elimination@1.0.10: resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==} @@ -6457,8 +6457,8 @@ packages: lodash.isarguments@3.1.0: resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} - lodash@4.17.23: - resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} @@ -7396,8 +7396,9 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} @@ -10317,7 +10318,7 @@ snapshots: exit-hook: 2.2.1 isbot: 5.1.31 jsesc: 3.0.2 - lodash: 4.17.23 + lodash: 4.18.1 p-map: 7.0.3 pathe: 1.1.2 picocolors: 1.1.1 @@ -11090,7 +11091,7 @@ snapshots: chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 - lodash: 4.17.23 + lodash: 4.18.1 redent: 3.0.0 '@testing-library/jest-dom@6.9.1': @@ -11983,11 +11984,11 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axios@1.13.5: + axios@1.15.0: dependencies: follow-redirects: 1.15.11 form-data: 4.0.5 - proxy-from-env: 1.1.0 + proxy-from-env: 2.1.0 transitivePeerDependencies: - debug @@ -12836,7 +12837,7 @@ snapshots: express-winston@4.2.0(winston@3.17.0): dependencies: chalk: 2.4.2 - lodash: 4.17.23 + lodash: 4.18.1 winston: 3.17.0 express-ws@5.0.2(express@4.22.0): @@ -13315,7 +13316,7 @@ snapshots: dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 - lodash: 4.17.23 + lodash: 4.18.1 pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: @@ -13783,7 +13784,7 @@ snapshots: lodash.isarguments@3.1.0: {} - lodash@4.17.23: {} + lodash@4.18.1: {} log-update@6.1.0: dependencies: @@ -14859,7 +14860,7 @@ snapshots: pretty-error@4.0.0: dependencies: - lodash: 4.17.23 + lodash: 4.18.1 renderkid: 3.0.0 pretty-format@27.5.1: @@ -14997,7 +14998,7 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - proxy-from-env@1.1.0: {} + proxy-from-env@2.1.0: {} punycode.js@2.3.1: {} @@ -15040,7 +15041,7 @@ snapshots: react-color@2.19.3(react@18.3.1): dependencies: '@icons/material': 0.2.4(react@18.3.1) - lodash: 4.17.23 + lodash: 4.18.1 lodash-es: 4.18.0 material-colors: 1.2.6 prop-types: 15.8.1 @@ -15146,7 +15147,7 @@ snapshots: create-react-class: 15.7.0 element-resize-detector: 1.2.4 imagesloaded: 4.1.4 - lodash: 4.17.23 + lodash: 4.18.1 masonry-layout: 4.2.2 prop-types: 15.8.1 react: 18.3.1 @@ -15237,7 +15238,7 @@ snapshots: reactcss@1.2.3(react@18.3.1): dependencies: - lodash: 4.17.23 + lodash: 4.18.1 react: 18.3.1 read-cache@1.0.0: @@ -15270,7 +15271,7 @@ snapshots: dependencies: clsx: 2.1.1 eventemitter3: 4.0.7 - lodash: 4.17.23 + lodash: 4.18.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-is: 18.3.1 @@ -15383,7 +15384,7 @@ snapshots: css-select: 4.3.0 dom-converter: 0.2.0 htmlparser2: 6.1.0 - lodash: 4.17.23 + lodash: 4.18.1 strip-ansi: 6.0.1 require-directory@2.1.1: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 7e9519830e6..5917b09c38e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -19,7 +19,7 @@ catalog: "@types/node": 22.12.0 "@types/react-dom": 18.3.1 "@types/react": 18.3.11 - axios: 1.13.5 + axios: 1.15.0 express: 4.22.0 lodash-es: 4.18.0 lucide-react: 0.469.0 From db3c8f27dcd73e54229368152a034e272a3ca0c6 Mon Sep 17 00:00:00 2001 From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Date: Mon, 13 Apr 2026 18:24:12 +0530 Subject: [PATCH 09/21] [WEB-6840] feat: skip role & use-case steps for self-hosted instances (#8890) --- .../web/core/components/onboarding/header.tsx | 29 +++++++++---------- apps/web/core/components/onboarding/root.tsx | 14 +++++++-- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/apps/web/core/components/onboarding/header.tsx b/apps/web/core/components/onboarding/header.tsx index 4ebf6a9c156..224fca5f09f 100644 --- a/apps/web/core/components/onboarding/header.tsx +++ b/apps/web/core/components/onboarding/header.tsx @@ -12,6 +12,7 @@ import type { TOnboardingStep } from "@plane/types"; import { EOnboardingSteps } from "@plane/types"; import { cn } from "@plane/utils"; // hooks +import { useInstance } from "@/hooks/store/use-instance"; import { useUser } from "@/hooks/store/user"; // local imports import { SwitchAccountDropdown } from "./switch-account-dropdown"; @@ -26,6 +27,8 @@ export const OnboardingHeader = observer(function OnboardingHeader(props: Onboar const { currentStep, updateCurrentStep, hasInvitations } = props; // store hooks const { data: user } = useUser(); + const { config: instanceConfig } = useInstance(); + const isSelfManaged = instanceConfig?.is_self_managed; // handle step back const handleStepBack = () => { @@ -37,7 +40,7 @@ export const OnboardingHeader = observer(function OnboardingHeader(props: Onboar updateCurrentStep(EOnboardingSteps.ROLE_SETUP); break; case EOnboardingSteps.WORKSPACE_CREATE_OR_JOIN: - updateCurrentStep(EOnboardingSteps.USE_CASE_SETUP); + updateCurrentStep(isSelfManaged ? EOnboardingSteps.PROFILE_SETUP : EOnboardingSteps.USE_CASE_SETUP); break; } }; @@ -45,22 +48,18 @@ export const OnboardingHeader = observer(function OnboardingHeader(props: Onboar // can go back const canGoBack = ![EOnboardingSteps.PROFILE_SETUP, EOnboardingSteps.INVITE_MEMBERS].includes(currentStep); - // Get current step number for progress tracking - const getCurrentStepNumber = (): number => { - const stepOrder: TOnboardingStep[] = [ - EOnboardingSteps.PROFILE_SETUP, - EOnboardingSteps.ROLE_SETUP, - EOnboardingSteps.USE_CASE_SETUP, - ...(hasInvitations - ? [EOnboardingSteps.WORKSPACE_CREATE_OR_JOIN] - : [EOnboardingSteps.WORKSPACE_CREATE_OR_JOIN, EOnboardingSteps.INVITE_MEMBERS]), - ]; - return stepOrder.indexOf(currentStep) + 1; - }; + // step order for progress tracking — include INVITE_MEMBERS if user is currently on it + const showInviteStep = !hasInvitations || currentStep === EOnboardingSteps.INVITE_MEMBERS; + const stepOrder: TOnboardingStep[] = [ + EOnboardingSteps.PROFILE_SETUP, + ...(isSelfManaged ? [] : [EOnboardingSteps.ROLE_SETUP, EOnboardingSteps.USE_CASE_SETUP]), + EOnboardingSteps.WORKSPACE_CREATE_OR_JOIN, + ...(showInviteStep ? [EOnboardingSteps.INVITE_MEMBERS] : []), + ]; // derived values - const currentStepNumber = getCurrentStepNumber(); - const totalSteps = hasInvitations ? 4 : 5; // 4 if invites available, 5 if not + const currentStepNumber = stepOrder.indexOf(currentStep) + 1; + const totalSteps = stepOrder.length; const userName = user?.display_name ? user?.display_name : user?.first_name diff --git a/apps/web/core/components/onboarding/root.tsx b/apps/web/core/components/onboarding/root.tsx index cc8e7cfe41f..395e19b0957 100644 --- a/apps/web/core/components/onboarding/root.tsx +++ b/apps/web/core/components/onboarding/root.tsx @@ -11,6 +11,7 @@ import { TOAST_TYPE, setToast } from "@plane/propel/toast"; import type { IWorkspaceMemberInvitation, TOnboardingStep, TOnboardingSteps, TUserProfile } from "@plane/types"; import { EOnboardingSteps } from "@plane/types"; // hooks +import { useInstance } from "@/hooks/store/use-instance"; import { useWorkspace } from "@/hooks/store/use-workspace"; import { useUser, useUserProfile } from "@/hooks/store/user"; // local components @@ -27,8 +28,10 @@ export const OnboardingRoot = observer(function OnboardingRoot({ invitations = [ const { data: user } = useUser(); const { data: userProfile, updateUserProfile, finishUserOnboarding } = useUserProfile(); const { workspaces } = useWorkspace(); + const { config: instanceConfig } = useInstance(); const workspacesList = Object.values(workspaces ?? {}); + const isSelfManaged = instanceConfig?.is_self_managed; // Calculate total steps based on whether invitations are available const hasInvitations = invitations.length > 0; @@ -68,7 +71,14 @@ export const OnboardingRoot = observer(function OnboardingRoot({ invitations = [ (step: EOnboardingSteps, skipInvites?: boolean) => { switch (step) { case EOnboardingSteps.PROFILE_SETUP: - setCurrentStep(EOnboardingSteps.ROLE_SETUP); + if (isSelfManaged) { + // Skip role & use case steps for self-hosted + stepChange({ profile_complete: true }); + if (workspacesList.length > 0) finishOnboarding(); + else setCurrentStep(EOnboardingSteps.WORKSPACE_CREATE_OR_JOIN); + } else { + setCurrentStep(EOnboardingSteps.ROLE_SETUP); + } break; case EOnboardingSteps.ROLE_SETUP: setCurrentStep(EOnboardingSteps.USE_CASE_SETUP); @@ -91,7 +101,7 @@ export const OnboardingRoot = observer(function OnboardingRoot({ invitations = [ break; } }, - [stepChange, finishOnboarding, workspacesList] + [stepChange, finishOnboarding, workspacesList, isSelfManaged] ); const updateCurrentStep = (step: EOnboardingSteps) => setCurrentStep(step); From bbf14fba31c0d8be9435eb32eedad9673ff1ed98 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 13:54:04 +0530 Subject: [PATCH 10/21] chore(deps): bump pytest (#8891) Bumps the pip group with 1 update in the /apps/api/requirements directory: [pytest](https://github.com/pytest-dev/pytest). Updates `pytest` from 9.0.2 to 9.0.3 - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/9.0.2...9.0.3) --- updated-dependencies: - dependency-name: pytest dependency-version: 9.0.3 dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- apps/api/requirements/test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/requirements/test.txt b/apps/api/requirements/test.txt index c3149753572..bed38224a2f 100644 --- a/apps/api/requirements/test.txt +++ b/apps/api/requirements/test.txt @@ -1,6 +1,6 @@ -r base.txt # test framework -pytest==9.0.2 +pytest==9.0.3 pytest-django==4.5.2 pytest-cov==4.1.0 pytest-xdist==3.3.1 From 13db2f883f141f139b106f9459c44ad030772d73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ph=E1=BA=A1m=20Nguy=C3=AAn=20Ph=C6=B0=C6=A1ng?= <69796528+PhuongPN6689@users.noreply.github.com> Date: Tue, 14 Apr 2026 15:24:28 +0700 Subject: [PATCH 11/21] enhance sub-issue query performance with optimized annotations and subqueries (#8889) --- apps/api/plane/app/views/issue/sub_issue.py | 165 ++++++++++++-------- 1 file changed, 98 insertions(+), 67 deletions(-) diff --git a/apps/api/plane/app/views/issue/sub_issue.py b/apps/api/plane/app/views/issue/sub_issue.py index b52e07564f6..5194148dd7b 100644 --- a/apps/api/plane/app/views/issue/sub_issue.py +++ b/apps/api/plane/app/views/issue/sub_issue.py @@ -7,7 +7,7 @@ # Django imports from django.utils import timezone -from django.db.models import OuterRef, Func, F, Q, Value, UUIDField, Subquery +from django.db.models import OuterRef, Func, F, Q, Value, UUIDField, Subquery, Count, IntegerField from django.utils.decorators import method_decorator from django.views.decorators.gzip import gzip_page from django.contrib.postgres.aggregates import ArrayAgg @@ -22,7 +22,7 @@ from .. import BaseAPIView from plane.app.serializers import IssueSerializer from plane.app.permissions import ProjectEntityPermission -from plane.db.models import Issue, IssueLink, FileAsset, CycleIssue +from plane.db.models import Issue, IssueLink, FileAsset, CycleIssue, IssueLabel, IssueAssignee, ModuleIssue from plane.bgtasks.issue_activities_task import issue_activity from plane.utils.timezone_converter import user_timezone_converter from collections import defaultdict @@ -37,70 +37,97 @@ class SubIssuesEndpoint(BaseAPIView): def get(self, request, slug, project_id, issue_id): sub_issues = ( Issue.issue_objects.filter(parent_id=issue_id, workspace__slug=slug) - .select_related("workspace", "project", "state", "parent") - .prefetch_related("assignees", "labels", "issue_module__module") .annotate( cycle_id=Subquery( CycleIssue.objects.filter(issue=OuterRef("id"), deleted_at__isnull=True).values("cycle_id")[:1] ) ) .annotate( - link_count=IssueLink.objects.filter(issue=OuterRef("id")) - .order_by() - .annotate(count=Func(F("id"), function="Count")) - .values("count") + link_count=Coalesce( + Subquery( + IssueLink.objects.filter(issue=OuterRef("id")) + .order_by() + .values("issue") + .annotate(count=Count("id")) + .values("count"), + output_field=IntegerField(), + ), + 0, + ) ) .annotate( - attachment_count=FileAsset.objects.filter( - issue_id=OuterRef("id"), - entity_type=FileAsset.EntityTypeContext.ISSUE_ATTACHMENT, + attachment_count=Coalesce( + Subquery( + FileAsset.objects.filter( + issue_id=OuterRef("id"), + entity_type=FileAsset.EntityTypeContext.ISSUE_ATTACHMENT, + ) + .order_by() + .values("issue_id") + .annotate(count=Count("id")) + .values("count"), + output_field=IntegerField(), + ), + 0, ) - .order_by() - .annotate(count=Func(F("id"), function="Count")) - .values("count") ) .annotate( - sub_issues_count=Issue.issue_objects.filter(parent=OuterRef("id")) - .order_by() - .annotate(count=Func(F("id"), function="Count")) - .values("count") + sub_issues_count=Coalesce( + Subquery( + Issue.issue_objects.filter(parent=OuterRef("id")) + .order_by() + .values("parent") + .annotate(count=Count("id")) + .values("count"), + output_field=IntegerField(), + ), + 0, + ) ) .annotate( label_ids=Coalesce( - ArrayAgg( - "labels__id", - distinct=True, - filter=Q(~Q(labels__id__isnull=True) & Q(label_issue__deleted_at__isnull=True)), + Subquery( + IssueLabel.objects.filter(issue_id=OuterRef("id"), deleted_at__isnull=True) + .order_by() + .values("issue_id") + .annotate(arr=ArrayAgg("label_id", distinct=True)) + .values("arr"), + output_field=ArrayField(UUIDField()), ), Value([], output_field=ArrayField(UUIDField())), ), assignee_ids=Coalesce( - ArrayAgg( - "assignees__id", - distinct=True, - filter=Q( - ~Q(assignees__id__isnull=True) - & Q(assignees__member_project__is_active=True) - & Q(issue_assignee__deleted_at__isnull=True) - ), + Subquery( + IssueAssignee.objects.filter( + issue_id=OuterRef("id"), + assignee__member_project__is_active=True, + deleted_at__isnull=True, + ) + .order_by() + .values("issue_id") + .annotate(arr=ArrayAgg("assignee_id", distinct=True)) + .values("arr"), + output_field=ArrayField(UUIDField()), ), Value([], output_field=ArrayField(UUIDField())), ), module_ids=Coalesce( - ArrayAgg( - "issue_module__module_id", - distinct=True, - filter=Q( - ~Q(issue_module__module_id__isnull=True) - & Q(issue_module__module__archived_at__isnull=True) - & Q(issue_module__deleted_at__isnull=True) - ), + Subquery( + ModuleIssue.objects.filter( + issue_id=OuterRef("id"), + module__archived_at__isnull=True, + deleted_at__isnull=True, + ) + .order_by() + .values("issue_id") + .annotate(arr=ArrayAgg("module_id", distinct=True)) + .values("arr"), + output_field=ArrayField(UUIDField()), ), Value([], output_field=ArrayField(UUIDField())), ), ) .annotate(state_group=F("state__group")) - .order_by("-created_at") ) # Ordering @@ -110,38 +137,42 @@ def get(self, request, slug, project_id, issue_id): if order_by_param: sub_issues, order_by_param = order_issue_queryset(sub_issues, order_by_param) + sub_issues = list( + sub_issues.values( + "id", + "name", + "state_id", + "sort_order", + "completed_at", + "estimate_point", + "priority", + "start_date", + "target_date", + "sequence_id", + "project_id", + "parent_id", + "cycle_id", + "module_ids", + "label_ids", + "assignee_ids", + "sub_issues_count", + "created_at", + "updated_at", + "created_by", + "updated_by", + "attachment_count", + "link_count", + "is_draft", + "archived_at", + "state_group", + ) + ) + # create's a dict with state group name with their respective issue id's result = defaultdict(list) for sub_issue in sub_issues: - result[sub_issue.state_group].append(str(sub_issue.id)) + result[sub_issue["state_group"]].append(str(sub_issue["id"])) - sub_issues = sub_issues.values( - "id", - "name", - "state_id", - "sort_order", - "completed_at", - "estimate_point", - "priority", - "start_date", - "target_date", - "sequence_id", - "project_id", - "parent_id", - "cycle_id", - "module_ids", - "label_ids", - "assignee_ids", - "sub_issues_count", - "created_at", - "updated_at", - "created_by", - "updated_by", - "attachment_count", - "link_count", - "is_draft", - "archived_at", - ) datetime_fields = ["created_at", "updated_at"] sub_issues = user_timezone_converter(sub_issues, datetime_fields, request.user.user_timezone) # Grouping From ac11c3ef7939e31201fa92a17de106906025590f Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Mon, 20 Apr 2026 15:26:59 +0530 Subject: [PATCH 12/21] fix: enforce workspace membership on V2 asset endpoints (#8885) WorkspaceFileAssetEndpoint had no authorization checks beyond authentication, allowing any logged-in user to create, read, patch, and delete assets in any workspace by slug. DuplicateAssetEndpoint only authorized the destination workspace, letting users copy assets from workspaces they don't belong to. Add @allow_permission decorators to all WorkspaceFileAssetEndpoint methods and scope DuplicateAssetEndpoint's source asset lookup to workspaces where the caller is an active member. Ref: GHSA-qw87-v5w3-6vxx --- apps/api/plane/app/views/asset/v2.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/apps/api/plane/app/views/asset/v2.py b/apps/api/plane/app/views/asset/v2.py index 62c5f84a20b..a83c5ec998f 100644 --- a/apps/api/plane/app/views/asset/v2.py +++ b/apps/api/plane/app/views/asset/v2.py @@ -18,7 +18,7 @@ # Module imports from ..base import BaseAPIView -from plane.db.models import FileAsset, Workspace, Project, User +from plane.db.models import FileAsset, Workspace, Project, User, WorkspaceMember from plane.settings.storage import S3Storage from plane.app.permissions import allow_permission, ROLE from plane.utils.cache import invalidate_cache_directly @@ -311,6 +311,7 @@ def entity_asset_delete(self, entity_type, asset, request): else: return + @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="WORKSPACE") def post(self, request, slug): name = request.data.get("name") type = request.data.get("type", "image/jpeg") @@ -376,6 +377,7 @@ def post(self, request, slug): status=status.HTTP_200_OK, ) + @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="WORKSPACE") def patch(self, request, slug, asset_id): # get the asset id asset = FileAsset.objects.get(id=asset_id, workspace__slug=slug) @@ -397,6 +399,7 @@ def patch(self, request, slug, asset_id): asset.save(update_fields=["is_uploaded", "attributes"]) return Response(status=status.HTTP_204_NO_CONTENT) + @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="WORKSPACE") def delete(self, request, slug, asset_id): asset = FileAsset.objects.get(id=asset_id, workspace__slug=slug) asset.is_deleted = True @@ -406,6 +409,7 @@ def delete(self, request, slug, asset_id): asset.save(update_fields=["is_deleted", "deleted_at"]) return Response(status=status.HTTP_204_NO_CONTENT) + @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="WORKSPACE") def get(self, request, slug, asset_id): # get the asset id asset = FileAsset.objects.get(id=asset_id, workspace__slug=slug) @@ -752,7 +756,16 @@ def post(self, request, slug, asset_id): return Response({"error": "Project not found"}, status=status.HTTP_404_NOT_FOUND) storage = S3Storage(request=request) - original_asset = FileAsset.objects.filter(id=asset_id, is_uploaded=True).first() + # Scope the source asset lookup to workspaces the caller is a member of + user_workspace_ids = WorkspaceMember.objects.filter( + member=request.user, + is_active=True, + ).values_list("workspace_id", flat=True) + original_asset = FileAsset.objects.filter( + id=asset_id, + is_uploaded=True, + workspace_id__in=user_workspace_ids, + ).first() if not original_asset: return Response({"error": "Asset not found"}, status=status.HTTP_404_NOT_FOUND) From a8a16c8ba0b555438c0fe50e5217cc6ac5eda328 Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Mon, 20 Apr 2026 15:28:33 +0530 Subject: [PATCH 13/21] fix: replace IS_SELF_MANAGED with WEBHOOK_ALLOWED_IPS allowlist (#8884) * fix: replace IS_SELF_MANAGED toggle with explicit WEBHOOK_ALLOWED_IPS allowlist Instead of blanket-allowing all private IPs on self-managed deployments, webhook URL validation now blocks all private/internal IPs by default and only permits specific networks listed in the WEBHOOK_ALLOWED_IPS env variable (comma-separated IPs/CIDRs). * fix: address PR review comments for webhook SSRF protection - Sanitize error messages to avoid leaking internal details to clients - Guard against TypeError with mixed IPv4/IPv6 allowlist networks - Re-validate webhook URL at send time to prevent DNS-rebinding - Add unit tests for mixed-version IP network allowlists --- apps/api/plane/app/serializers/webhook.py | 75 +++++-------------- apps/api/plane/bgtasks/webhook_task.py | 4 + apps/api/plane/settings/common.py | 17 +++++ .../unit/bg_tasks/test_work_item_link_task.py | 46 ++++++++++++ apps/api/plane/utils/ip_address.py | 46 ++++++++++++ 5 files changed, 133 insertions(+), 55 deletions(-) diff --git a/apps/api/plane/app/serializers/webhook.py b/apps/api/plane/app/serializers/webhook.py index 74ebde89205..c5d0dd41e9a 100644 --- a/apps/api/plane/app/serializers/webhook.py +++ b/apps/api/plane/app/serializers/webhook.py @@ -3,90 +3,55 @@ # See the LICENSE file for details. # Python imports -import socket -import ipaddress +import logging from urllib.parse import urlparse # Third party imports from rest_framework import serializers +# Django imports +from django.conf import settings + # Module imports from .base import DynamicBaseSerializer from plane.db.models import Webhook, WebhookLog from plane.db.models.webhook import validate_domain, validate_schema +from plane.utils.ip_address import validate_url + +logger = logging.getLogger(__name__) class WebhookSerializer(DynamicBaseSerializer): url = serializers.URLField(validators=[validate_schema, validate_domain]) - def create(self, validated_data): - url = validated_data.get("url", None) - - # Extract the hostname from the URL - hostname = urlparse(url).hostname - if not hostname: - raise serializers.ValidationError({"url": "Invalid URL: No hostname found."}) - - # Resolve the hostname to IP addresses + def _validate_webhook_url(self, url): + """Validate a webhook URL against SSRF and disallowed domain rules.""" try: - ip_addresses = socket.getaddrinfo(hostname, None) - except socket.gaierror: - raise serializers.ValidationError({"url": "Hostname could not be resolved."}) - - if not ip_addresses: - raise serializers.ValidationError({"url": "No IP addresses found for the hostname."}) + validate_url(url, allowed_ips=settings.WEBHOOK_ALLOWED_IPS) + except ValueError as e: + logger.warning("Webhook URL validation failed for %s: %s", url, e) + raise serializers.ValidationError({"url": "Invalid or disallowed webhook URL."}) - for addr in ip_addresses: - ip = ipaddress.ip_address(addr[4][0]) - if ip.is_private or ip.is_loopback or ip.is_reserved or ip.is_link_local: - raise serializers.ValidationError({"url": "URL resolves to a blocked IP address."}) + hostname = (urlparse(url).hostname or "").rstrip(".").lower() - # Additional validation for multiple request domains and their subdomains request = self.context.get("request") - disallowed_domains = ["plane.so"] # Add your disallowed domains here + disallowed_domains = ["plane.so"] if request: - request_host = request.get_host().split(":")[0] # Remove port if present + request_host = request.get_host().split(":")[0].rstrip(".").lower() disallowed_domains.append(request_host) - # Check if hostname is a subdomain or exact match of any disallowed domain if any(hostname == domain or hostname.endswith("." + domain) for domain in disallowed_domains): raise serializers.ValidationError({"url": "URL domain or its subdomain is not allowed."}) + def create(self, validated_data): + url = validated_data.get("url", None) + self._validate_webhook_url(url) return Webhook.objects.create(**validated_data) def update(self, instance, validated_data): url = validated_data.get("url", None) if url: - # Extract the hostname from the URL - hostname = urlparse(url).hostname - if not hostname: - raise serializers.ValidationError({"url": "Invalid URL: No hostname found."}) - - # Resolve the hostname to IP addresses - try: - ip_addresses = socket.getaddrinfo(hostname, None) - except socket.gaierror: - raise serializers.ValidationError({"url": "Hostname could not be resolved."}) - - if not ip_addresses: - raise serializers.ValidationError({"url": "No IP addresses found for the hostname."}) - - for addr in ip_addresses: - ip = ipaddress.ip_address(addr[4][0]) - if ip.is_private or ip.is_loopback or ip.is_reserved or ip.is_link_local: - raise serializers.ValidationError({"url": "URL resolves to a blocked IP address."}) - - # Additional validation for multiple request domains and their subdomains - request = self.context.get("request") - disallowed_domains = ["plane.so"] # Add your disallowed domains here - if request: - request_host = request.get_host().split(":")[0] # Remove port if present - disallowed_domains.append(request_host) - - # Check if hostname is a subdomain or exact match of any disallowed domain - if any(hostname == domain or hostname.endswith("." + domain) for domain in disallowed_domains): - raise serializers.ValidationError({"url": "URL domain or its subdomain is not allowed."}) - + self._validate_webhook_url(url) return super().update(instance, validated_data) class Meta: diff --git a/apps/api/plane/bgtasks/webhook_task.py b/apps/api/plane/bgtasks/webhook_task.py index 6543c3845b8..89d98757679 100644 --- a/apps/api/plane/bgtasks/webhook_task.py +++ b/apps/api/plane/bgtasks/webhook_task.py @@ -52,6 +52,7 @@ from plane.license.utils.instance_value import get_email_configuration from plane.utils.email import generate_plain_text_from_html from plane.utils.exception_logger import log_exception +from plane.utils.ip_address import validate_url from plane.settings.mongo import MongoConnection @@ -325,6 +326,9 @@ def webhook_send_task( return try: + # Re-validate the webhook URL at send time to prevent DNS-rebinding attacks + validate_url(webhook.url, allowed_ips=settings.WEBHOOK_ALLOWED_IPS) + # Send the webhook event response = requests.post(webhook.url, headers=headers, json=payload, timeout=30) diff --git a/apps/api/plane/settings/common.py b/apps/api/plane/settings/common.py index 9d651bd1b4c..d90ee10f891 100644 --- a/apps/api/plane/settings/common.py +++ b/apps/api/plane/settings/common.py @@ -5,6 +5,8 @@ """Global Settings""" # Python imports +import ipaddress +import logging import os from urllib.parse import urlparse from urllib.parse import urljoin @@ -32,6 +34,21 @@ # Self-hosted mode IS_SELF_MANAGED = True +# Webhook IP allowlist — comma-separated IPs or CIDR ranges that are allowed as +# webhook targets even if they resolve to private networks. +# Example: "10.0.0.0/8,192.168.1.0/24,172.16.0.5" +_webhook_allowed_ips_raw = os.environ.get("WEBHOOK_ALLOWED_IPS", "") +WEBHOOK_ALLOWED_IPS = [] +_logger = logging.getLogger("plane") +for _cidr in _webhook_allowed_ips_raw.split(","): + _cidr = _cidr.strip() + if not _cidr: + continue + try: + WEBHOOK_ALLOWED_IPS.append(ipaddress.ip_network(_cidr, strict=False)) + except ValueError: + _logger.warning("WEBHOOK_ALLOWED_IPS: skipping invalid entry %r", _cidr) + # Allowed Hosts ALLOWED_HOSTS = os.environ.get("ALLOWED_HOSTS", "*").split(",") diff --git a/apps/api/plane/tests/unit/bg_tasks/test_work_item_link_task.py b/apps/api/plane/tests/unit/bg_tasks/test_work_item_link_task.py index 2838260e890..67c61c6ccae 100644 --- a/apps/api/plane/tests/unit/bg_tasks/test_work_item_link_task.py +++ b/apps/api/plane/tests/unit/bg_tasks/test_work_item_link_task.py @@ -2,9 +2,12 @@ # SPDX-License-Identifier: AGPL-3.0-only # See the LICENSE file for details. +import ipaddress + import pytest from unittest.mock import patch, MagicMock from plane.bgtasks.work_item_link_task import safe_get, validate_url_ip +from plane.utils.ip_address import validate_url def _make_response(status_code=200, headers=None, is_redirect=False, content=b""): @@ -43,6 +46,49 @@ def test_allows_public_ip(self): validate_url_ip("https://example.com") # Should not raise +@pytest.mark.unit +class TestValidateUrlAllowlist: + """Test validate_url allowlist permits specific private IPs.""" + + def test_allowlist_permits_private_ip(self): + allowed = [ipaddress.ip_network("192.168.1.0/24")] + with patch("plane.utils.ip_address.socket.getaddrinfo") as mock_dns: + mock_dns.return_value = [(None, None, None, None, ("192.168.1.50", 0))] + validate_url("http://example.com", allowed_ips=allowed) # Should not raise + + def test_allowlist_does_not_permit_other_private_ip(self): + allowed = [ipaddress.ip_network("192.168.1.0/24")] + with patch("plane.utils.ip_address.socket.getaddrinfo") as mock_dns: + mock_dns.return_value = [(None, None, None, None, ("10.0.0.1", 0))] + with pytest.raises(ValueError, match="private/internal"): + validate_url("http://example.com", allowed_ips=allowed) + + def test_allowlist_permits_loopback_when_explicitly_allowed(self): + allowed = [ipaddress.ip_network("127.0.0.0/8")] + with patch("plane.utils.ip_address.socket.getaddrinfo") as mock_dns: + mock_dns.return_value = [(None, None, None, None, ("127.0.0.1", 0))] + validate_url("http://example.com", allowed_ips=allowed) # Should not raise + + def test_allowlist_permits_matching_ipv4_with_mixed_version_networks(self): + allowed = [ + ipaddress.ip_network("2001:db8::/32"), + ipaddress.ip_network("192.168.1.0/24"), + ] + with patch("plane.utils.ip_address.socket.getaddrinfo") as mock_dns: + mock_dns.return_value = [(None, None, None, None, ("192.168.1.50", 0))] + validate_url("http://example.com", allowed_ips=allowed) # Should not raise + + def test_allowlist_blocks_non_matching_ipv4_with_mixed_version_networks(self): + allowed = [ + ipaddress.ip_network("2001:db8::/32"), + ipaddress.ip_network("192.168.1.0/24"), + ] + with patch("plane.utils.ip_address.socket.getaddrinfo") as mock_dns: + mock_dns.return_value = [(None, None, None, None, ("10.0.0.1", 0))] + with pytest.raises(ValueError, match="private/internal"): + validate_url("http://example.com", allowed_ips=allowed) + + @pytest.mark.unit class TestSafeGet: """Test safe_get follows redirects safely and blocks SSRF.""" diff --git a/apps/api/plane/utils/ip_address.py b/apps/api/plane/utils/ip_address.py index 3a0f171d793..4102ad6f4c2 100644 --- a/apps/api/plane/utils/ip_address.py +++ b/apps/api/plane/utils/ip_address.py @@ -2,6 +2,52 @@ # SPDX-License-Identifier: AGPL-3.0-only # See the LICENSE file for details. +# Python imports +import ipaddress +import socket +from urllib.parse import urlparse + + +def validate_url(url, allowed_ips=None): + """ + Validate that a URL doesn't resolve to a private/internal IP address (SSRF protection). + + Args: + url: The URL to validate. + allowed_ips: Optional list of ipaddress.ip_network objects. IPs falling within + these networks are permitted even if they are private/loopback/reserved. + Typically sourced from the WEBHOOK_ALLOWED_IPS setting. + + Raises: + ValueError: If the URL is invalid or resolves to a blocked IP. + """ + parsed = urlparse(url) + hostname = parsed.hostname + + if not hostname: + raise ValueError("Invalid URL: No hostname found") + + if parsed.scheme not in ("http", "https"): + raise ValueError("Invalid URL scheme. Only HTTP and HTTPS are allowed") + + try: + addr_info = socket.getaddrinfo(hostname, None) + except socket.gaierror: + raise ValueError("Hostname could not be resolved") + + if not addr_info: + raise ValueError("No IP addresses found for the hostname") + + for addr in addr_info: + ip = ipaddress.ip_address(addr[4][0]) + if ip.is_private or ip.is_loopback or ip.is_reserved or ip.is_link_local: + if allowed_ips and any( + network.version == ip.version and ip in network for network in allowed_ips + ): + continue + raise ValueError("Access to private/internal networks is not allowed") + + def get_client_ip(request): x_forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR") if x_forwarded_for: From 45b4fc89325db052256a774438fe67a277791bf5 Mon Sep 17 00:00:00 2001 From: Saurabh Kumar <70131915+Saurabhkmr98@users.noreply.github.com> Date: Mon, 20 Apr 2026 15:29:28 +0530 Subject: [PATCH 14/21] [SILO-1158] chore: add context for project in relations API (#8860) * add context for project in relations API * modify issue relation serializer --- apps/api/plane/api/serializers/issue.py | 42 +++++--- apps/api/plane/api/views/issue.py | 135 +++++++++++++++++------- 2 files changed, 121 insertions(+), 56 deletions(-) diff --git a/apps/api/plane/api/serializers/issue.py b/apps/api/plane/api/serializers/issue.py index 6468ddbc84f..048de6e92b1 100644 --- a/apps/api/plane/api/serializers/issue.py +++ b/apps/api/plane/api/serializers/issue.py @@ -480,44 +480,52 @@ class Meta: ] +class IssueRelationRefSerializer(serializers.Serializer): + """Project-scoped reference to a related work item.""" + + project_id = serializers.UUIDField(help_text="Project containing the related work item") + issue_id = serializers.UUIDField(help_text="ID of the related work item") + + class IssueRelationResponseSerializer(serializers.Serializer): """ Serializer for issue relations response showing grouped relation types. - Returns issue IDs organized by relation type for efficient client-side processing. + Each list contains project_id and issue_id pairs so clients can resolve + cross-project relations. """ blocking = serializers.ListField( - child=serializers.UUIDField(), - help_text="List of issue IDs that are blocking this issue", + child=IssueRelationRefSerializer(), + help_text="Work items blocking this issue", ) blocked_by = serializers.ListField( - child=serializers.UUIDField(), - help_text="List of issue IDs that this issue is blocked by", + child=IssueRelationRefSerializer(), + help_text="Work items this issue is blocked by", ) duplicate = serializers.ListField( - child=serializers.UUIDField(), - help_text="List of issue IDs that are duplicates of this issue", + child=IssueRelationRefSerializer(), + help_text="Duplicate work items", ) relates_to = serializers.ListField( - child=serializers.UUIDField(), - help_text="List of issue IDs that relate to this issue", + child=IssueRelationRefSerializer(), + help_text="Related work items", ) start_after = serializers.ListField( - child=serializers.UUIDField(), - help_text="List of issue IDs that start after this issue", + child=IssueRelationRefSerializer(), + help_text="Work items that start after this issue", ) start_before = serializers.ListField( - child=serializers.UUIDField(), - help_text="List of issue IDs that start before this issue", + child=IssueRelationRefSerializer(), + help_text="Work items that start before this issue", ) finish_after = serializers.ListField( - child=serializers.UUIDField(), - help_text="List of issue IDs that finish after this issue", + child=IssueRelationRefSerializer(), + help_text="Work items that finish after this issue", ) finish_before = serializers.ListField( - child=serializers.UUIDField(), - help_text="List of issue IDs that finish before this issue", + child=IssueRelationRefSerializer(), + help_text="Work items that finish before this issue", ) diff --git a/apps/api/plane/api/views/issue.py b/apps/api/plane/api/views/issue.py index 97e8e7cee0a..180d6844754 100644 --- a/apps/api/plane/api/views/issue.py +++ b/apps/api/plane/api/views/issue.py @@ -23,11 +23,8 @@ Value, When, Subquery, - UUIDField, ) -from django.db.models.functions import Coalesce -from django.contrib.postgres.aggregates import ArrayAgg -from django.contrib.postgres.fields import ArrayField + from django.utils import timezone from django.conf import settings @@ -2292,14 +2289,35 @@ class IssueRelationListCreateAPIEndpoint(BaseAPIView): name="Work Item Relations Response", value={ "blocking": [ - "550e8400-e29b-41d4-a716-446655440000", - "550e8400-e29b-41d4-a716-446655440001", + { + "project_id": "550e8400-e29b-41d4-a716-446655440010", + "issue_id": "550e8400-e29b-41d4-a716-446655440000", + }, + { + "project_id": "550e8400-e29b-41d4-a716-446655440010", + "issue_id": "550e8400-e29b-41d4-a716-446655440001", + }, + ], + "blocked_by": [ + { + "project_id": "550e8400-e29b-41d4-a716-446655440011", + "issue_id": "550e8400-e29b-41d4-a716-446655440002", + }, ], - "blocked_by": ["550e8400-e29b-41d4-a716-446655440002"], "duplicate": [], - "relates_to": ["550e8400-e29b-41d4-a716-446655440003"], + "relates_to": [ + { + "project_id": "550e8400-e29b-41d4-a716-446655440010", + "issue_id": "550e8400-e29b-41d4-a716-446655440003", + }, + ], "start_after": [], - "start_before": ["550e8400-e29b-41d4-a716-446655440004"], + "start_before": [ + { + "project_id": "550e8400-e29b-41d4-a716-446655440012", + "issue_id": "550e8400-e29b-41d4-a716-446655440004", + }, + ], "finish_after": [], "finish_before": [], }, @@ -2316,42 +2334,81 @@ def get(self, request, slug, project_id, issue_id): Retrieve all relationships for a work item organized by relation type. Returns a structured response with relations grouped by type. """ - empty_uuid_array = Value([], output_field=ArrayField(UUIDField())) - - def _agg_ids(field, **filter_kwargs): - return Coalesce( - ArrayAgg(field, filter=Q(**filter_kwargs), distinct=True), - empty_uuid_array, - ) - - issue_relation_qs = IssueRelation.objects.filter( + relations = IssueRelation.objects.filter( Q(issue_id=issue_id) | Q(related_issue_id=issue_id), workspace__slug=slug, - ) - - relation_ids = issue_relation_qs.aggregate( - blocking_ids=_agg_ids("issue_id", relation_type="blocked_by", related_issue_id=issue_id), - blocked_by_ids=_agg_ids("related_issue_id", relation_type="blocked_by", issue_id=issue_id), - duplicate_ids=_agg_ids("related_issue_id", relation_type="duplicate", issue_id=issue_id), - duplicate_ids_related=_agg_ids("issue_id", relation_type="duplicate", related_issue_id=issue_id), - relates_to_ids=_agg_ids("related_issue_id", relation_type="relates_to", issue_id=issue_id), - relates_to_ids_related=_agg_ids("issue_id", relation_type="relates_to", related_issue_id=issue_id), - start_after_ids=_agg_ids("issue_id", relation_type="start_before", related_issue_id=issue_id), - start_before_ids=_agg_ids("related_issue_id", relation_type="start_before", issue_id=issue_id), - finish_after_ids=_agg_ids("issue_id", relation_type="finish_before", related_issue_id=issue_id), - finish_before_ids=_agg_ids("related_issue_id", relation_type="finish_before", issue_id=issue_id), + ).values( + "relation_type", + "issue_id", + "related_issue_id", + issue_project_id=F("issue__project_id"), + related_issue_project_id=F("related_issue__project_id"), ) response_data = { - "blocking": relation_ids["blocking_ids"], - "blocked_by": relation_ids["blocked_by_ids"], - "duplicate": list(set(relation_ids["duplicate_ids"] + relation_ids["duplicate_ids_related"])), - "relates_to": list(set(relation_ids["relates_to_ids"] + relation_ids["relates_to_ids_related"])), - "start_after": relation_ids["start_after_ids"], - "start_before": relation_ids["start_before_ids"], - "finish_after": relation_ids["finish_after_ids"], - "finish_before": relation_ids["finish_before_ids"], + "blocking": [], + "blocked_by": [], + "duplicate": [], + "relates_to": [], + "start_after": [], + "start_before": [], + "finish_after": [], + "finish_before": [], } + seen_duplicate = set() + seen_relates_to = set() + + for rel in relations: + rt = rel["relation_type"] + if rt == "blocked_by": + if str(rel["related_issue_id"]) == str(issue_id): + response_data["blocking"].append( + {"project_id": str(rel["issue_project_id"]), "issue_id": str(rel["issue_id"])} + ) + if str(rel["issue_id"]) == str(issue_id): + response_data["blocked_by"].append( + {"project_id": str(rel["related_issue_project_id"]), "issue_id": str(rel["related_issue_id"])} + ) + elif rt == "duplicate": + if str(rel["issue_id"]) == str(issue_id) and rel["related_issue_id"] not in seen_duplicate: + seen_duplicate.add(rel["related_issue_id"]) + response_data["duplicate"].append( + {"project_id": str(rel["related_issue_project_id"]), "issue_id": str(rel["related_issue_id"])} + ) + if str(rel["related_issue_id"]) == str(issue_id) and rel["issue_id"] not in seen_duplicate: + seen_duplicate.add(rel["issue_id"]) + response_data["duplicate"].append( + {"project_id": str(rel["issue_project_id"]), "issue_id": str(rel["issue_id"])} + ) + elif rt == "relates_to": + if str(rel["issue_id"]) == str(issue_id) and rel["related_issue_id"] not in seen_relates_to: + seen_relates_to.add(rel["related_issue_id"]) + response_data["relates_to"].append( + {"project_id": str(rel["related_issue_project_id"]), "issue_id": str(rel["related_issue_id"])} + ) + if str(rel["related_issue_id"]) == str(issue_id) and rel["issue_id"] not in seen_relates_to: + seen_relates_to.add(rel["issue_id"]) + response_data["relates_to"].append( + {"project_id": str(rel["issue_project_id"]), "issue_id": str(rel["issue_id"])} + ) + elif rt == "start_before": + if str(rel["related_issue_id"]) == str(issue_id): + response_data["start_after"].append( + {"project_id": str(rel["issue_project_id"]), "issue_id": str(rel["issue_id"])} + ) + if str(rel["issue_id"]) == str(issue_id): + response_data["start_before"].append( + {"project_id": str(rel["related_issue_project_id"]), "issue_id": str(rel["related_issue_id"])} + ) + elif rt == "finish_before": + if str(rel["related_issue_id"]) == str(issue_id): + response_data["finish_after"].append( + {"project_id": str(rel["issue_project_id"]), "issue_id": str(rel["issue_id"])} + ) + if str(rel["issue_id"]) == str(issue_id): + response_data["finish_before"].append( + {"project_id": str(rel["related_issue_project_id"]), "issue_id": str(rel["related_issue_id"])} + ) return Response(response_data, status=status.HTTP_200_OK) From aea66f53f4022bd51cbc829bc03baa048c03e011 Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Mon, 20 Apr 2026 15:33:30 +0530 Subject: [PATCH 15/21] fix: sanitize filenames in upload paths to prevent path traversal (#8879) * fix: sanitize filenames in upload paths to prevent path traversal (GHSA-v57h-5999-w7xp) Add server-side filename sanitization across all file upload endpoints to prevent path traversal sequences (../) in user-supplied filenames from being incorporated into S3 object keys. While S3 keys are flat strings and not vulnerable to filesystem traversal, this adds defense-in-depth and prevents S3 key pollution. Changes: - Add sanitize_filename() utility in path_validator.py - Sanitize filenames in get_upload_path() for FileAsset and IssueAttachment models - Sanitize name parameter in all upload view endpoints * fix: address PR review feedback on filename sanitization - Remove unused `import re` - Normalize backslashes to forward slashes before os.path.basename() so Windows-style paths (e.g. ..\..\..\evil.txt) are handled on POSIX - Strip whitespace before removing leading dots so " .env" is caught - Return None instead of "unnamed" for empty input so existing `if not name` validation guards remain effective - Add `or "unnamed"` fallback at call sites that lack a name guard * fix: use random hex name as fallback in get_upload_path instead of "unnamed" * fix: resolve ruff E501 line too long in DuplicateAssetEndpoint --- apps/api/plane/api/views/asset.py | 7 ++-- apps/api/plane/api/views/issue.py | 3 +- apps/api/plane/app/views/asset/v2.py | 10 +++-- apps/api/plane/app/views/issue/attachment.py | 3 +- apps/api/plane/db/models/asset.py | 3 ++ apps/api/plane/db/models/issue.py | 2 + apps/api/plane/space/views/asset.py | 3 +- apps/api/plane/utils/path_validator.py | 41 ++++++++++++++++++++ 8 files changed, 62 insertions(+), 10 deletions(-) diff --git a/apps/api/plane/api/views/asset.py b/apps/api/plane/api/views/asset.py index 88c34c37cad..72ce60e6819 100644 --- a/apps/api/plane/api/views/asset.py +++ b/apps/api/plane/api/views/asset.py @@ -17,6 +17,7 @@ # Module Imports from plane.bgtasks.storage_metadata_task import get_asset_object_metadata from plane.settings.storage import S3Storage +from plane.utils.path_validator import sanitize_filename from plane.db.models import FileAsset, User, Workspace from plane.api.views.base import BaseAPIView from plane.api.serializers import ( @@ -114,7 +115,7 @@ def post(self, request): This endpoint generates the necessary credentials for direct S3 upload. """ # get the asset key - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) or "unnamed" type = request.data.get("type", "image/jpeg") size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) entity_type = request.data.get("entity_type", False) @@ -287,7 +288,7 @@ def post(self, request): necessary credentials for direct S3 upload with server-side authentication. """ # get the asset key - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) or "unnamed" type = request.data.get("type", "image/jpeg") size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) entity_type = request.data.get("entity_type", False) @@ -498,7 +499,7 @@ def post(self, request, slug): Create a presigned URL for uploading generic assets that can be bound to entities like work items. Supports various file types and includes external source tracking for integrations. """ - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) type = request.data.get("type") size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) project_id = request.data.get("project_id") diff --git a/apps/api/plane/api/views/issue.py b/apps/api/plane/api/views/issue.py index 180d6844754..b48be56d413 100644 --- a/apps/api/plane/api/views/issue.py +++ b/apps/api/plane/api/views/issue.py @@ -79,6 +79,7 @@ Workspace, ) from plane.settings.storage import S3Storage +from plane.utils.path_validator import sanitize_filename from plane.bgtasks.storage_metadata_task import get_asset_object_metadata from .base import BaseAPIView from plane.utils.host import base_host @@ -1858,7 +1859,7 @@ def post(self, request, slug, project_id, issue_id): status=status.HTTP_403_FORBIDDEN, ) - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) type = request.data.get("type", False) size = request.data.get("size") external_id = request.data.get("external_id") diff --git a/apps/api/plane/app/views/asset/v2.py b/apps/api/plane/app/views/asset/v2.py index a83c5ec998f..b21f70d61fc 100644 --- a/apps/api/plane/app/views/asset/v2.py +++ b/apps/api/plane/app/views/asset/v2.py @@ -22,6 +22,7 @@ from plane.settings.storage import S3Storage from plane.app.permissions import allow_permission, ROLE from plane.utils.cache import invalidate_cache_directly +from plane.utils.path_validator import sanitize_filename from plane.bgtasks.storage_metadata_task import get_asset_object_metadata from plane.throttles.asset import AssetRateThrottle @@ -108,7 +109,7 @@ def entity_asset_delete(self, entity_type, asset, request): def post(self, request): # get the asset key - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) or "unnamed" type = request.data.get("type", "image/jpeg") size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) entity_type = request.data.get("entity_type", False) @@ -313,7 +314,7 @@ def entity_asset_delete(self, entity_type, asset, request): @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="WORKSPACE") def post(self, request, slug): - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) or "unnamed" type = request.data.get("type", "image/jpeg") size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) entity_type = request.data.get("entity_type") @@ -515,7 +516,7 @@ def get_entity_id_field(self, entity_type, entity_id): @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST]) def post(self, request, slug, project_id): - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) or "unnamed" type = request.data.get("type", "image/jpeg") size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) entity_type = request.data.get("entity_type", "") @@ -770,7 +771,8 @@ def post(self, request, slug, asset_id): if not original_asset: return Response({"error": "Asset not found"}, status=status.HTTP_404_NOT_FOUND) - destination_key = f"{workspace.id}/{uuid.uuid4().hex}-{original_asset.attributes.get('name')}" + sanitized_name = sanitize_filename(original_asset.attributes.get("name")) or "unnamed" + destination_key = f"{workspace.id}/{uuid.uuid4().hex}-{sanitized_name}" duplicated_asset = FileAsset.objects.create( attributes={ "name": original_asset.attributes.get("name"), diff --git a/apps/api/plane/app/views/issue/attachment.py b/apps/api/plane/app/views/issue/attachment.py index df027c413b1..51248b8a428 100644 --- a/apps/api/plane/app/views/issue/attachment.py +++ b/apps/api/plane/app/views/issue/attachment.py @@ -24,6 +24,7 @@ from plane.bgtasks.issue_activities_task import issue_activity from plane.app.permissions import allow_permission, ROLE from plane.settings.storage import S3Storage +from plane.utils.path_validator import sanitize_filename from plane.bgtasks.storage_metadata_task import get_asset_object_metadata from plane.utils.host import base_host @@ -97,7 +98,7 @@ class IssueAttachmentV2Endpoint(BaseAPIView): @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST]) def post(self, request, slug, project_id, issue_id): - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) or "unnamed" type = request.data.get("type", False) size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) diff --git a/apps/api/plane/db/models/asset.py b/apps/api/plane/db/models/asset.py index d309135bcac..55efff7f41d 100644 --- a/apps/api/plane/db/models/asset.py +++ b/apps/api/plane/db/models/asset.py @@ -11,10 +11,13 @@ from django.db import models # Module import +from plane.utils.path_validator import sanitize_filename + from .base import BaseModel def get_upload_path(instance, filename): + filename = sanitize_filename(filename) or uuid4().hex if instance.workspace_id is not None: return f"{instance.workspace.id}/{uuid4().hex}-{filename}" return f"user-{uuid4().hex}-{filename}" diff --git a/apps/api/plane/db/models/issue.py b/apps/api/plane/db/models/issue.py index d24efc8a23c..f4175c47852 100644 --- a/apps/api/plane/db/models/issue.py +++ b/apps/api/plane/db/models/issue.py @@ -17,6 +17,7 @@ # Module imports from plane.utils.html_processor import strip_tags +from plane.utils.path_validator import sanitize_filename from plane.db.mixins import SoftDeletionManager from plane.utils.exception_logger import log_exception from .project import ProjectBaseModel @@ -376,6 +377,7 @@ def __str__(self): def get_upload_path(instance, filename): + filename = sanitize_filename(filename) or uuid4().hex return f"{instance.workspace.id}/{uuid4().hex}-{filename}" diff --git a/apps/api/plane/space/views/asset.py b/apps/api/plane/space/views/asset.py index 1749a8fd462..bc20724ca80 100644 --- a/apps/api/plane/space/views/asset.py +++ b/apps/api/plane/space/views/asset.py @@ -18,6 +18,7 @@ from plane.bgtasks.storage_metadata_task import get_asset_object_metadata from plane.db.models import DeployBoard, FileAsset from plane.settings.storage import S3Storage +from plane.utils.path_validator import sanitize_filename # Module imports from .base import BaseAPIView @@ -73,7 +74,7 @@ def post(self, request, anchor): return Response({"error": "Project is not published"}, status=status.HTTP_404_NOT_FOUND) # Get the asset - name = request.data.get("name") + name = sanitize_filename(request.data.get("name")) or "unnamed" type = request.data.get("type", "image/jpeg") size = int(request.data.get("size", settings.FILE_SIZE_LIMIT)) entity_type = request.data.get("entity_type", "") diff --git a/apps/api/plane/utils/path_validator.py b/apps/api/plane/utils/path_validator.py index f15fb4ca953..901464ee6af 100644 --- a/apps/api/plane/utils/path_validator.py +++ b/apps/api/plane/utils/path_validator.py @@ -7,9 +7,50 @@ from django.conf import settings # Python imports +import os from urllib.parse import urlparse +def sanitize_filename(filename): + """ + Sanitize a filename to prevent path traversal attacks. + + Strips directory components, path traversal sequences, and null bytes + from user-supplied filenames used in upload paths and S3 object keys. + + Returns None for empty/missing input so callers can still validate + that a filename was provided. + """ + if not filename or not isinstance(filename, str): + return None + + # Strip null bytes + filename = filename.replace("\x00", "") + + # Normalize backslashes so os.path.basename handles Windows-style paths on POSIX + filename = filename.replace("\\", "/") + + # Take only the basename to remove any directory components + filename = os.path.basename(filename) + + # Remove any remaining path traversal sequences + filename = filename.replace("..", "") + + # Strip whitespace before removing leading dots so " .env" is caught + filename = filename.strip() + + # Remove leading dots (hidden files) + filename = filename.lstrip(".") + + # Strip any remaining whitespace + filename = filename.strip() + + if not filename: + return None + + return filename + + def _contains_suspicious_patterns(path: str) -> bool: """ Check for suspicious patterns that might indicate malicious intent. From da41f14a057e04f7c19e6cf380e755deab98dbcf Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Mon, 20 Apr 2026 15:39:30 +0530 Subject: [PATCH 16/21] chore(ci): suppress CodeQL file coverage deprecation warning (#8916) * chore(ci): suppress CodeQL file coverage deprecation warning Explicitly opt into the new default behavior where CodeQL skips computing file coverage information on pull requests for improved analysis performance. * Update .github/workflows/codeql.yml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/workflows/codeql.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index a645c192ff3..9414b09008b 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -16,6 +16,9 @@ jobs: contents: read security-events: write + env: + CODEQL_ACTION_FILE_COVERAGE_ON_PRS: "false" + strategy: fail-fast: false matrix: From 62b2d1b20729284b425e69c734b3a414cfe6a7e1 Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Mon, 20 Apr 2026 17:17:34 +0530 Subject: [PATCH 17/21] chore: update CODEOWNERS for apps and deployments (#8919) * chore: update CODEOWNERS for apps and deployments Assign owners per app/area so reviews are routed to the right maintainers. * chore: update the codeowners --- CODEOWNERS | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CODEOWNERS b/CODEOWNERS index 11c7335b578..8adbaa17197 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1,8 @@ -eslint.config.mjs @lifeiscontent \ No newline at end of file +.oxlintrc.json @sriramveeraghanta @lifeiscontent +.oxfmtrc.json @sriramveeraghanta @lifeiscontent +apps/api/ @dheeru0198 @pablohashescobar +apps/web/ @sriramveeraghanta +apps/space/ @sriramveeraghanta +apps/admin/ @sriramveeraghanta +apps/live/ @Palanikannan1437 +deployments/ @mguptahub \ No newline at end of file From f1d567accc5e6dbfb56265de850cb1cac4188cb5 Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Mon, 20 Apr 2026 17:17:54 +0530 Subject: [PATCH 18/21] chore: add Claude Code skills for PR descriptions and release notes (#8920) * chore: add Claude Code skills for PR descriptions and release notes * chore(skills): update release-notes branches to canary->master and example version to v1.3.0 * chore(skills): address PR review comments - pr-description: infer base branch from PR metadata, fix Improvement wording, reference template's screenshot placeholder verbatim - release-notes: add `text` language to unlabeled fenced code block --- .claude/skills/pr-description.md | 58 ++++++++++++ .claude/skills/release-notes.md | 147 +++++++++++++++++++++++++++++++ 2 files changed, 205 insertions(+) create mode 100644 .claude/skills/pr-description.md create mode 100644 .claude/skills/release-notes.md diff --git a/.claude/skills/pr-description.md b/.claude/skills/pr-description.md new file mode 100644 index 00000000000..bfbfa78ba9d --- /dev/null +++ b/.claude/skills/pr-description.md @@ -0,0 +1,58 @@ +--- +name: pr-description +description: Generate a PR description following the project's GitHub PR template. Analyzes the current branch's changes against the base branch to produce a complete, filled-out PR description. +user_invocable: true +--- + +# PR Description Generator + +Generate a pull request description based on the project's PR template at `.github/pull_request_template.md`. + +## Steps + +1. **Determine the base branch**: Prefer the PR's actual `baseRefName` (via `gh pr view --json baseRefName`) when a PR exists. Otherwise default by intent — feature PRs target `preview`, release PRs target `master`. If still ambiguous, ask the user. + +2. **Analyze changes**: Run the following to understand what changed: + - `git log ...HEAD --oneline` to see all commits on this branch + - `git diff ...HEAD --stat` to see which files changed + - `git diff ...HEAD` to read the actual diff (use `--no-color`) + - If the diff is very large, focus on the most important files first + +3. **Fill out the PR template** with the following sections: + + ### Description + + Write a clear, concise summary of what the PR does and why. Focus on the "what" and "why", not line-by-line changes. Mention any important implementation decisions. + + ### Type of Change + + Check the appropriate box(es) based on the changes: + - Bug fix (non-breaking change which fixes an issue) + - Feature (non-breaking change which adds functionality) + - Improvement (non-breaking change that improves existing functionality) + - Code refactoring + - Performance improvements + - Documentation update + + ### Screenshots and Media + + Leave this section for the user to fill in, preserving the existing placeholder comment from `.github/pull_request_template.md` verbatim rather than introducing different text. + + ### Test Scenarios + + Based on the code changes, suggest specific test scenarios that should be verified. Be concrete (e.g., "Navigate to project settings and verify the new toggle works") rather than generic. + + ### References + - If commit messages or branch name reference a work item identifier (e.g., `WEB-1234`), include it + - If the user provides a linked issue, include it + - If Sentry issue links or IDs (e.g., `SENTRY-ABC123`, Sentry URLs) were mentioned earlier in the conversation, include them as references + +4. **Output format**: Print the filled-out markdown template so the user can copy it directly. Do NOT wrap it in a code fence — output the raw markdown. + +## Guidelines + +- Keep the description concise but informative +- Use bullet points for multiple changes +- Focus on user-facing impact, not implementation details +- If the branch has a Plane work item ID in its name (e.g., `WEB-1234`), reference it +- Don't fabricate test scenarios that aren't relevant to the actual changes diff --git a/.claude/skills/release-notes.md b/.claude/skills/release-notes.md new file mode 100644 index 00000000000..af8a7680e72 --- /dev/null +++ b/.claude/skills/release-notes.md @@ -0,0 +1,147 @@ +--- +name: release-notes +description: "Generate release notes for a Plane release PR in `makeplane/plane` (semver, e.g. `release: vX.Y.Z`). Reads PR commits, filters out noise, categorizes by conventional-commit type, optionally enriches via Plane MCP, and writes the result as the PR description." +user_invocable: true +--- + +# Release Notes Generator + +Generate structured release notes from a Plane release PR by parsing its commit list, then update the PR description. + +## Versioning + +Plane community uses **semver** (`vX.Y.Z`, major.minor.patch) for releases. + +- PR title format: `release: vX.Y.Z` +- Source branch: `canary` +- Target branch: `master` + +## When to Use + +- User links/mentions a Plane release PR (e.g. `release: v1.3.0`) and asks for release notes +- User asks to "create release notes" / "update PR description" for a release PR in `makeplane/plane` +- The branch is named `canary` or `release/x.y.z` and the base is `master` + +## Steps + +### 1. Fetch commits + +```bash +gh pr view --json title,body,baseRefName,headRefName,commits \ + --jq '.commits[] | .messageHeadline + "\n---BODY---\n" + .messageBody + "\n===END==="' +``` + +For a quick scan first: + +```bash +gh pr view --json commits \ + --jq '.commits[] | {oid: .oid[0:10], message: .messageHeadline}' +``` + +### 2. Filter out noise + +**Always exclude** these commits — mechanical, not user-facing: + +| Pattern | Reason | +| -------------------------------------------- | -------------- | +| `fix: merge conflicts` | Merge artifact | +| `Merge branch '...' of github.com:...` | Merge artifact | +| `Revert "..."` (when immediately re-applied) | Internal churn | + +### 3. Parse work item IDs + +Most meaningful commits begin with a Plane work item identifier in brackets: + +- `[WEB-XXXX]` — web/frontend product items +- `[SILO-XXXX]` — Silo (integrations: Slack, GitHub, GitLab, Jira/Linear) +- `[MOBILE-XXXX]`, `[API-XXXX]`, etc. + +Always preserve these IDs in the release notes — they let readers click through to the source ticket. + +### 4. (Optional) Enrich via Plane MCP + +For larger features where the commit headline is terse, fetch the work item: + +```text +mcp__plane__retrieve_work_item_by_identifier(project_identifier="WEB", issue_identifier=6874) +``` + +Use the returned `name` and `description_stripped` to flesh out the bullet. Skip this for routine fixes — commit body is usually enough. Don't enrich every item (slow + work item descriptions are often empty). + +### 5. Categorize by conventional-commit type + +| Commit prefix | Section | +| -------------------------------- | ------------------- | +| `feat:`, `feat(scope):` | ✨ New Features | +| `fix:`, `fix(scope):` | 🐛 Bug Fixes | +| `refactor:` | 🔧 Refactor & Chore | +| `chore:`, `chore(scope):` | 🔧 Refactor & Chore | +| `chore(deps):`, dependabot bumps | 📦 Dependencies | + +### 6. Format + +```markdown +# Release vX.Y.Z + +## ✨ New Features + +- **** — [WEB-XXXX] (#PR_NUM) + Optional 1–2 sentence elaboration drawn from commit body. + +## 🐛 Bug Fixes + +- **** — [WEB-XXXX] (#PR_NUM) + +## 🔧 Refactor & Chore + +- **** — [WEB-XXXX] (#PR_NUM) + +## 📦 Dependencies + +- Bump `` X.Y.Z → A.B.C (#PR_NUM) +``` + +Rules: + +- Lead with a bold human-readable title (rewrite the commit subject if cryptic) +- Always include the work item ID in brackets and the merge PR number in parens +- Add a sub-line elaboration only when the commit body has substance worth surfacing (acceptance criteria, scope notes, gotchas like "behind feature flag", "requires migration", "requires Vercel setting") +- Drop empty sections + +### 7. Update the PR description + +```bash +gh pr edit --body "$(cat <<'EOF' + +EOF +)" +``` + +Always use a HEREDOC with single-quoted `'EOF'` so backticks/dollars in the notes are preserved. + +## Quick Reference: end-to-end + +```bash +PR=2498 +gh pr view $PR --json commits --jq '.commits[] | .messageHeadline + "\n---\n" + .messageBody + "\n==="' > /tmp/commits.txt +# read /tmp/commits.txt, filter, categorize, draft notes +gh pr edit $PR --body "$(cat <<'EOF' +... release notes ... +EOF +)" +``` + +## Common Mistakes + +- **Including `fix: merge conflicts`** — merge artifact, no functional content +- **Dropping the work item ID** — readers rely on `[WEB-XXXX]` to navigate to the ticket +- **Over-enriching with MCP lookups** — work item descriptions are often empty; commit body is usually richer +- **Missing the merge PR number** — always include `(#NNNN)` from the commit subject so reviewers can audit the source PR +- **Using `--body` without HEREDOC** — backticks/dollar signs get shell-interpreted and corrupt the notes +- **Editing the title** — release PR titles are version markers; only edit the body + +## Plane-Specific Conventions + +- Release PRs go from `canary` → `master` +- PR title format: `release: vX.Y.Z` semver (major.minor.patch) +- Commits coming from feature branches always carry a work item ID; commits without one are usually infra/chores From c62930ebcfab1a9591379289d505effbe92dcf32 Mon Sep 17 00:00:00 2001 From: sriramveeraghanta Date: Mon, 20 Apr 2026 17:20:12 +0530 Subject: [PATCH 19/21] chore: bump up the package version --- apps/admin/package.json | 2 +- apps/api/package.json | 2 +- apps/live/package.json | 2 +- apps/space/package.json | 2 +- apps/web/package.json | 2 +- package.json | 2 +- packages/codemods/package.json | 2 +- packages/constants/package.json | 2 +- packages/editor/package.json | 2 +- packages/hooks/package.json | 2 +- packages/i18n/package.json | 2 +- packages/logger/package.json | 2 +- packages/propel/package.json | 2 +- packages/services/package.json | 2 +- packages/shared-state/package.json | 2 +- packages/tailwind-config/package.json | 2 +- packages/types/package.json | 2 +- packages/typescript-config/package.json | 2 +- packages/ui/package.json | 2 +- packages/utils/package.json | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/apps/admin/package.json b/apps/admin/package.json index 8a492643a5e..e9cf80d5ea3 100644 --- a/apps/admin/package.json +++ b/apps/admin/package.json @@ -1,6 +1,6 @@ { "name": "admin", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "Admin UI for Plane", "license": "AGPL-3.0", diff --git a/apps/api/package.json b/apps/api/package.json index 99f5de98794..082853e24a2 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -1,6 +1,6 @@ { "name": "plane-api", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "API server powering Plane's backend", "license": "AGPL-3.0" diff --git a/apps/live/package.json b/apps/live/package.json index 1570ed9d764..9269c0a763a 100644 --- a/apps/live/package.json +++ b/apps/live/package.json @@ -1,6 +1,6 @@ { "name": "live", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "A realtime collaborative server powers Plane's rich text editor", "license": "AGPL-3.0", diff --git a/apps/space/package.json b/apps/space/package.json index 4500152f7d1..502b99afce2 100644 --- a/apps/space/package.json +++ b/apps/space/package.json @@ -1,6 +1,6 @@ { "name": "space", - "version": "1.3.0", + "version": "1.3.1", "private": true, "license": "AGPL-3.0", "type": "module", diff --git a/apps/web/package.json b/apps/web/package.json index d84d9ff0f58..c0f87e25cd6 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,6 +1,6 @@ { "name": "web", - "version": "1.3.0", + "version": "1.3.1", "private": true, "license": "AGPL-3.0", "type": "module", diff --git a/package.json b/package.json index 7c0ce03f1e8..99ef758acdd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "plane", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "Open-source project management that unlocks customer value", "license": "AGPL-3.0", diff --git a/packages/codemods/package.json b/packages/codemods/package.json index e335d735b68..e9402ca6333 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -1,6 +1,6 @@ { "name": "@plane/codemods", - "version": "1.3.0", + "version": "1.3.1", "private": true, "scripts": { "test": "vitest run", diff --git a/packages/constants/package.json b/packages/constants/package.json index dabdd16129d..800df400ddf 100644 --- a/packages/constants/package.json +++ b/packages/constants/package.json @@ -1,6 +1,6 @@ { "name": "@plane/constants", - "version": "1.3.0", + "version": "1.3.1", "private": true, "license": "AGPL-3.0", "type": "module", diff --git a/packages/editor/package.json b/packages/editor/package.json index 9235ba0cbca..ae4aa512d42 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -1,6 +1,6 @@ { "name": "@plane/editor", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "Core Editor that powers Plane", "keywords": [ diff --git a/packages/hooks/package.json b/packages/hooks/package.json index 2a6076951ef..68429efff88 100644 --- a/packages/hooks/package.json +++ b/packages/hooks/package.json @@ -1,6 +1,6 @@ { "name": "@plane/hooks", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "React hooks that are shared across multiple apps internally", "license": "AGPL-3.0", diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 5fd80fca39d..406a5cea357 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@plane/i18n", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "I18n shared across multiple apps internally", "license": "AGPL-3.0", diff --git a/packages/logger/package.json b/packages/logger/package.json index 82a149c6d70..bb57e368223 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -1,6 +1,6 @@ { "name": "@plane/logger", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "Logger shared across multiple apps internally", "license": "AGPL-3.0", diff --git a/packages/propel/package.json b/packages/propel/package.json index fd0c162ef9f..a6c6ed642c6 100644 --- a/packages/propel/package.json +++ b/packages/propel/package.json @@ -1,6 +1,6 @@ { "name": "@plane/propel", - "version": "1.3.0", + "version": "1.3.1", "private": true, "license": "AGPL-3.0", "type": "module", diff --git a/packages/services/package.json b/packages/services/package.json index e4590d17958..40df0f0be51 100644 --- a/packages/services/package.json +++ b/packages/services/package.json @@ -1,6 +1,6 @@ { "name": "@plane/services", - "version": "1.3.0", + "version": "1.3.1", "private": true, "license": "AGPL-3.0", "type": "module", diff --git a/packages/shared-state/package.json b/packages/shared-state/package.json index 87a2df2ab43..4ebb0aa3fd5 100644 --- a/packages/shared-state/package.json +++ b/packages/shared-state/package.json @@ -1,6 +1,6 @@ { "name": "@plane/shared-state", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "Shared state shared across multiple apps internally", "license": "AGPL-3.0", diff --git a/packages/tailwind-config/package.json b/packages/tailwind-config/package.json index 80ab13ff008..b99a90f9c5a 100644 --- a/packages/tailwind-config/package.json +++ b/packages/tailwind-config/package.json @@ -1,6 +1,6 @@ { "name": "@plane/tailwind-config", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "common tailwind configuration across monorepo", "license": "AGPL-3.0", diff --git a/packages/types/package.json b/packages/types/package.json index 4ce05a2c7ea..487cdcaacc8 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@plane/types", - "version": "1.3.0", + "version": "1.3.1", "private": true, "license": "AGPL-3.0", "type": "module", diff --git a/packages/typescript-config/package.json b/packages/typescript-config/package.json index 4fc7797f587..85383c1a0b8 100644 --- a/packages/typescript-config/package.json +++ b/packages/typescript-config/package.json @@ -1,6 +1,6 @@ { "name": "@plane/typescript-config", - "version": "1.3.0", + "version": "1.3.1", "private": true, "license": "AGPL-3.0", "files": [ diff --git a/packages/ui/package.json b/packages/ui/package.json index 5801ff7052f..d0bd6f312c3 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@plane/ui", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "UI components shared across multiple apps internally", "license": "AGPL-3.0", diff --git a/packages/utils/package.json b/packages/utils/package.json index 712c0a3cfa0..6baa7bcd546 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@plane/utils", - "version": "1.3.0", + "version": "1.3.1", "private": true, "description": "Helper functions shared across multiple apps internally", "license": "AGPL-3.0", From 03a2be84b76ae12c88a6565b5fb3836397d18bce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Apr 2026 13:03:43 +0530 Subject: [PATCH 20/21] chore(deps): bump lxml (#8925) Bumps the pip group with 1 update in the /apps/api/requirements directory: [lxml](https://github.com/lxml/lxml). Updates `lxml` from 6.0.0 to 6.1.0 - [Release notes](https://github.com/lxml/lxml/releases) - [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt) - [Commits](https://github.com/lxml/lxml/compare/lxml-6.0.0...lxml-6.1.0) --- updated-dependencies: - dependency-name: lxml dependency-version: 6.1.0 dependency-type: direct:production dependency-group: pip ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- apps/api/requirements/base.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/api/requirements/base.txt b/apps/api/requirements/base.txt index 7778a71a353..a691e36efe6 100644 --- a/apps/api/requirements/base.txt +++ b/apps/api/requirements/base.txt @@ -53,7 +53,7 @@ posthog==3.5.0 # crypto cryptography==46.0.7 # html validator -lxml==6.0.0 +lxml==6.1.0 # s3 boto3==1.34.96 # password validator From 32fb88ab2480d9f7d1a37282739df920cef921b0 Mon Sep 17 00:00:00 2001 From: sriram veeraghanta Date: Sat, 25 Apr 2026 17:40:33 +0530 Subject: [PATCH 21/21] chore(deps): bump axios, uuid and add security overrides (#8930) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore(deps): bump axios, uuid and add security overrides Bump axios 1.15.0 → 1.15.2 and uuid 13.0.0 → 14.0.0 in the catalog, and add pnpm overrides pinning postcss >=8.5.10, follow-redirects >=1.16.0, and routing axios/uuid through the catalog. * fix: overrides --- package.json | 6 +- pnpm-lock.yaml | 206 +++++++++++++++++++++----------------------- pnpm-workspace.yaml | 4 +- 3 files changed, 103 insertions(+), 113 deletions(-) diff --git a/package.json b/package.json index 99ef758acdd..160b4c5749c 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,11 @@ "yaml@1": "1.10.3", "yaml@2": "2.8.3", "path-to-regexp": "0.1.13", - "defu": "6.1.5" + "defu": "6.1.5", + "postcss": "8.5.10", + "axios": "catalog:", + "follow-redirects": "1.16.0", + "uuid": "catalog:" }, "onlyBuiltDependencies": [ "@parcel/watcher", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0f2e9aa297..aba4b9f488b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -45,9 +45,6 @@ catalogs: '@types/react-dom': specifier: 18.3.1 version: 18.3.1 - axios: - specifier: 1.15.0 - version: 1.15.0 dotenv: specifier: 16.4.7 version: 16.4.7 @@ -78,9 +75,6 @@ catalogs: tsdown: specifier: 0.16.0 version: 0.16.0 - uuid: - specifier: 13.0.0 - version: 13.0.0 overrides: express: 4.22.0 @@ -120,6 +114,10 @@ overrides: yaml@2: 2.8.3 path-to-regexp: 0.1.13 defu: 6.1.5 + postcss: 8.5.10 + axios: 1.15.2 + follow-redirects: 1.16.0 + uuid: 14.0.0 importers: @@ -189,8 +187,8 @@ importers: specifier: ^3.13.12 version: 3.13.12 axios: - specifier: 'catalog:' - version: 1.15.0 + specifier: 1.15.2 + version: 1.15.2 isbot: specifier: ^5.1.31 version: 5.1.31 @@ -228,8 +226,8 @@ importers: specifier: 'catalog:' version: 2.2.4(react@18.3.1) uuid: - specifier: 'catalog:' - version: 13.0.0 + specifier: 14.0.0 + version: 14.0.0 devDependencies: '@plane/tailwind-config': specifier: workspace:* @@ -316,8 +314,8 @@ importers: specifier: 'catalog:' version: 2.26.2(@tiptap/core@2.26.3(@tiptap/pm@3.6.6))(@tiptap/pm@3.6.6) axios: - specifier: 'catalog:' - version: 1.15.0 + specifier: 1.15.2 + version: 1.15.2 compression: specifier: 1.8.1 version: 1.8.1 @@ -349,8 +347,8 @@ importers: specifier: ^0.34.3 version: 0.34.3 uuid: - specifier: 'catalog:' - version: 13.0.0 + specifier: 14.0.0 + version: 14.0.0 ws: specifier: ^8.18.3 version: 8.18.3 @@ -461,8 +459,8 @@ importers: specifier: 'catalog:' version: 7.13.1(react-router@7.12.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(typescript@5.8.3) axios: - specifier: 'catalog:' - version: 1.15.0 + specifier: 1.15.2 + version: 1.15.2 clsx: specifier: ^2.0.0 version: 2.1.1 @@ -512,8 +510,8 @@ importers: specifier: 'catalog:' version: 2.2.4(react@18.3.1) uuid: - specifier: 'catalog:' - version: 13.0.0 + specifier: 14.0.0 + version: 14.0.0 devDependencies: '@plane/tailwind-config': specifier: workspace:* @@ -621,8 +619,8 @@ importers: specifier: ^8.21.3 version: 8.21.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) axios: - specifier: 'catalog:' - version: 1.15.0 + specifier: 1.15.2 + version: 1.15.2 clsx: specifier: ^2.0.0 version: 2.1.1 @@ -714,8 +712,8 @@ importers: specifier: ^1.2.2 version: 1.3.0(react@18.3.1) uuid: - specifier: 'catalog:' - version: 13.0.0 + specifier: 14.0.0 + version: 14.0.0 devDependencies: '@plane/tailwind-config': specifier: workspace:* @@ -962,8 +960,8 @@ importers: specifier: ^0.8.10 version: 0.8.10(@tiptap/core@2.26.3(@tiptap/pm@2.26.1)) uuid: - specifier: 'catalog:' - version: 13.0.0 + specifier: 14.0.0 + version: 14.0.0 y-indexeddb: specifier: ^9.0.12 version: 9.0.12(yjs@13.6.27) @@ -996,8 +994,8 @@ importers: specifier: 'catalog:' version: 18.3.1 postcss: - specifier: ^8.4.38 - version: 8.5.6 + specifier: 8.5.10 + version: 8.5.10 tsdown: specifier: 'catalog:' version: 0.16.0(typescript@5.8.3)(unrun@0.2.34) @@ -1189,8 +1187,8 @@ importers: specifier: workspace:* version: link:../types axios: - specifier: 'catalog:' - version: 1.15.0 + specifier: 1.15.2 + version: 1.15.2 file-type: specifier: ^21.3.1 version: 21.3.3 @@ -1226,8 +1224,8 @@ importers: specifier: 'catalog:' version: 6.0.8(mobx@6.12.0) uuid: - specifier: 'catalog:' - version: 13.0.0 + specifier: 14.0.0 + version: 14.0.0 zod: specifier: ^3.22.2 version: 3.25.76 @@ -1254,8 +1252,8 @@ importers: specifier: 4.1.17 version: 4.1.17 postcss: - specifier: 8.5.6 - version: 8.5.6 + specifier: 8.5.10 + version: 8.5.10 devDependencies: tailwindcss: specifier: 4.1.17 @@ -1416,13 +1414,13 @@ importers: version: 18.3.1 autoprefixer: specifier: ^10.4.19 - version: 10.4.21(postcss@8.5.6) + version: 10.4.21(postcss@8.5.10) postcss-cli: specifier: ^11.0.0 - version: 11.0.1(jiti@2.6.1)(postcss@8.5.6) + version: 11.0.1(jiti@2.6.1)(postcss@8.5.10) postcss-nested: specifier: ^6.0.1 - version: 6.2.0(postcss@8.5.6) + version: 6.2.0(postcss@8.5.10) storybook: specifier: 9.1.19 version: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) @@ -1490,8 +1488,8 @@ importers: specifier: ^11.0.5 version: 11.0.5 uuid: - specifier: 'catalog:' - version: 13.0.0 + specifier: 14.0.0 + version: 14.0.0 devDependencies: '@plane/typescript-config': specifier: workspace:* @@ -4734,14 +4732,14 @@ packages: engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: - postcss: ^8.1.0 + postcss: 8.5.10 available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axios@1.15.0: - resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==} + axios@1.15.2: + resolution: {integrity: sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==} babel-dead-code-elimination@1.0.10: resolution: {integrity: sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA==} @@ -5722,8 +5720,8 @@ packages: fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -6044,7 +6042,7 @@ packages: resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: ^8.1.0 + postcss: 8.5.10 ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -7225,14 +7223,14 @@ packages: engines: {node: '>=18'} hasBin: true peerDependencies: - postcss: ^8.0.0 + postcss: 8.5.10 postcss-load-config@5.1.0: resolution: {integrity: sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==} engines: {node: '>= 18'} peerDependencies: jiti: '>=1.21.0' - postcss: '>=8.0.9' + postcss: 8.5.10 tsx: ^4.8.1 peerDependenciesMeta: jiti: @@ -7246,37 +7244,37 @@ packages: resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: ^8.1.0 + postcss: 8.5.10 postcss-modules-local-by-default@4.2.0: resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: ^8.1.0 + postcss: 8.5.10 postcss-modules-scope@3.2.1: resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: ^8.1.0 + postcss: 8.5.10 postcss-modules-values@4.0.0: resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: - postcss: ^8.1.0 + postcss: 8.5.10 postcss-nested@6.2.0: resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} engines: {node: '>=12.0'} peerDependencies: - postcss: ^8.2.14 + postcss: 8.5.10 postcss-reporter@7.1.0: resolution: {integrity: sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==} engines: {node: '>=10'} peerDependencies: - postcss: ^8.1.0 + postcss: 8.5.10 postcss-selector-parser@6.0.10: resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} @@ -7293,8 +7291,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.10: + resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} engines: {node: ^10 || ^12 || >=14} prettier@3.7.4: @@ -8431,16 +8429,8 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - - uuid@13.0.0: - resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} - hasBin: true - - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + uuid@14.0.0: + resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} hasBin: true uvu@0.5.6: @@ -9195,7 +9185,7 @@ snapshots: dependencies: '@effect/platform': 0.94.1(effect@3.20.0) effect: 3.20.0 - uuid: 11.1.0 + uuid: 14.0.0 optionalDependencies: ioredis: 5.7.0 @@ -9246,7 +9236,7 @@ snapshots: '@effect/experimental': 0.58.0(@effect/platform@0.94.1(effect@3.20.0))(effect@3.20.0)(ioredis@5.7.0) '@effect/platform': 0.94.1(effect@3.20.0) effect: 3.20.0 - uuid: 11.1.0 + uuid: 14.0.0 '@effect/workflow@0.16.0(@effect/experimental@0.58.0(@effect/platform@0.94.1(effect@3.20.0))(effect@3.20.0)(ioredis@5.7.0))(@effect/platform@0.94.1(effect@3.20.0))(@effect/rpc@0.73.0(@effect/platform@0.94.1(effect@3.20.0))(effect@3.20.0))(effect@3.20.0)': dependencies: @@ -9459,7 +9449,7 @@ snapshots: kleur: 4.1.5 lodash.debounce: 4.0.8 redlock: 4.2.0 - uuid: 11.1.0 + uuid: 14.0.0 y-protocols: 1.0.6(yjs@13.6.27) yjs: 13.6.27 transitivePeerDependencies: @@ -9485,7 +9475,7 @@ snapshots: async-lock: 1.4.1 kleur: 4.1.5 lib0: 0.2.114 - uuid: 11.1.0 + uuid: 14.0.0 ws: 8.18.3 y-protocols: 1.0.6(yjs@13.6.27) yjs: 13.6.27 @@ -10571,7 +10561,7 @@ snapshots: dequal: 2.0.3 polished: 4.3.1 storybook: 9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)) - uuid: 9.0.1 + uuid: 14.0.0 '@storybook/addon-backgrounds@8.6.14(storybook@9.1.19(@testing-library/dom@10.4.0)(prettier@3.7.4)(vite@7.3.2(@types/node@22.12.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.43.1)(yaml@2.8.3)))': dependencies: @@ -11050,7 +11040,7 @@ snapshots: '@alloc/quick-lru': 5.2.0 '@tailwindcss/node': 4.1.17 '@tailwindcss/oxide': 4.1.17 - postcss: 8.5.6 + postcss: 8.5.10 tailwindcss: 4.1.17 '@tailwindcss/typography@0.5.19': @@ -11970,23 +11960,23 @@ snapshots: attr-accept@2.2.5: {} - autoprefixer@10.4.21(postcss@8.5.6): + autoprefixer@10.4.21(postcss@8.5.10): dependencies: browserslist: 4.28.1 caniuse-lite: 1.0.30001759 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.6 + postcss: 8.5.10 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 - axios@1.15.0: + axios@1.15.2: dependencies: - follow-redirects: 1.15.11 + follow-redirects: 1.16.0 form-data: 4.0.5 proxy-from-env: 2.1.0 transitivePeerDependencies: @@ -12411,12 +12401,12 @@ snapshots: css-loader@6.11.0(webpack@5.104.1(@swc/core@1.13.5(@swc/helpers@0.5.17))): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) + icss-utils: 5.1.0(postcss@8.5.10) + postcss: 8.5.10 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.10) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.10) + postcss-modules-scope: 3.2.1(postcss@8.5.10) + postcss-modules-values: 4.0.0(postcss@8.5.10) postcss-value-parser: 4.2.0 semver: 7.7.4 optionalDependencies: @@ -12991,7 +12981,7 @@ snapshots: fn.name@1.1.0: {} - follow-redirects@1.15.11: {} + follow-redirects@1.16.0: {} fontfaceobserver@2.1.0: {} @@ -13375,9 +13365,9 @@ snapshots: safer-buffer: 2.1.2 optional: true - icss-utils@5.1.0(postcss@8.5.6): + icss-utils@5.1.0(postcss@8.5.10): dependencies: - postcss: 8.5.6 + postcss: 8.5.10 ieee754@1.2.1: {} @@ -14775,15 +14765,15 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-cli@11.0.1(jiti@2.6.1)(postcss@8.5.6): + postcss-cli@11.0.1(jiti@2.6.1)(postcss@8.5.10): dependencies: chokidar: 3.6.0 dependency-graph: 1.0.0 fs-extra: 11.3.1 picocolors: 1.1.1 - postcss: 8.5.6 - postcss-load-config: 5.1.0(jiti@2.6.1)(postcss@8.5.6) - postcss-reporter: 7.1.0(postcss@8.5.6) + postcss: 8.5.10 + postcss-load-config: 5.1.0(jiti@2.6.1)(postcss@8.5.10) + postcss-reporter: 7.1.0(postcss@8.5.10) pretty-hrtime: 1.0.3 read-cache: 1.0.0 slash: 5.1.0 @@ -14793,44 +14783,44 @@ snapshots: - jiti - tsx - postcss-load-config@5.1.0(jiti@2.6.1)(postcss@8.5.6): + postcss-load-config@5.1.0(jiti@2.6.1)(postcss@8.5.10): dependencies: lilconfig: 3.1.3 yaml: 2.8.3 optionalDependencies: jiti: 2.6.1 - postcss: 8.5.6 + postcss: 8.5.10 - postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + postcss-modules-extract-imports@3.1.0(postcss@8.5.10): dependencies: - postcss: 8.5.6 + postcss: 8.5.10 - postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + postcss-modules-local-by-default@4.2.0(postcss@8.5.10): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 + icss-utils: 5.1.0(postcss@8.5.10) + postcss: 8.5.10 postcss-selector-parser: 7.1.0 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.5.6): + postcss-modules-scope@3.2.1(postcss@8.5.10): dependencies: - postcss: 8.5.6 + postcss: 8.5.10 postcss-selector-parser: 7.1.0 - postcss-modules-values@4.0.0(postcss@8.5.6): + postcss-modules-values@4.0.0(postcss@8.5.10): dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 + icss-utils: 5.1.0(postcss@8.5.10) + postcss: 8.5.10 - postcss-nested@6.2.0(postcss@8.5.6): + postcss-nested@6.2.0(postcss@8.5.10): dependencies: - postcss: 8.5.6 + postcss: 8.5.10 postcss-selector-parser: 6.1.2 - postcss-reporter@7.1.0(postcss@8.5.6): + postcss-reporter@7.1.0(postcss@8.5.10): dependencies: picocolors: 1.1.1 - postcss: 8.5.6 + postcss: 8.5.10 thenby: 1.3.4 postcss-selector-parser@6.0.10: @@ -14850,7 +14840,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.6: + postcss@8.5.10: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 @@ -15536,7 +15526,7 @@ snapshots: htmlparser2: 8.0.2 is-plain-object: 5.0.0 parse-srcset: 1.0.2 - postcss: 8.5.6 + postcss: 8.5.10 saxes@6.0.0: dependencies: @@ -16250,11 +16240,7 @@ snapshots: utils-merge@1.0.1: {} - uuid@11.1.0: {} - - uuid@13.0.0: {} - - uuid@9.0.1: {} + uuid@14.0.0: {} uvu@0.5.6: dependencies: @@ -16356,7 +16342,7 @@ snapshots: esbuild: 0.25.0 fdir: 6.5.0(picomatch@2.3.2) picomatch: 2.3.2 - postcss: 8.5.6 + postcss: 8.5.10 rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5917b09c38e..07774acb972 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -19,7 +19,7 @@ catalog: "@types/node": 22.12.0 "@types/react-dom": 18.3.1 "@types/react": 18.3.11 - axios: 1.15.0 + axios: 1.15.2 express: 4.22.0 lodash-es: 4.18.0 lucide-react: 0.469.0 @@ -32,7 +32,7 @@ catalog: swr: 2.2.4 tsdown: 0.16.0 typescript: 5.8.3 - uuid: 13.0.0 + uuid: 14.0.0 vite: 7.3.2 onlyBuiltDependencies: