From 37c3ccd1bbec3412a9c3164d207480ccf4391e61 Mon Sep 17 00:00:00 2001 From: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com> Date: Fri, 29 May 2026 10:37:52 +0530 Subject: [PATCH 1/7] fix: pin minimatch@10 to 10.2.5 to bypass ReDoS (ENG-1113) (#8190) --- package.json | 3 ++- pnpm-lock.yaml | 11 ++--------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 8f71a91b4c41..455b3e20689a 100644 --- a/package.json +++ b/package.json @@ -96,6 +96,7 @@ "hono": "4.12.18", "ip-address": "10.1.1", "lodash": "4.18.1", + "minimatch@10": "10.2.5", "node-forge": "1.4.0", "postcss": "8.5.14", "protobufjs@7": "7.5.8", @@ -104,7 +105,7 @@ "uuid@11": "11.1.1" }, "comments": { - "overrides": "Security fixes for transitive dependencies that still fail a no-override audit. Remove each override when its upstream chain adopts a patched version: @hono/node-server/hono via Prisma dev tooling | @protobufjs/utf8 (CVE overlong UTF-8) - awaiting @opentelemetry/otlp-transformer update | @tootallnate/once and tar via sqlite3/node-gyp chain | @xmldom/xmldom (XML injection/DoS CVEs) - awaiting @boxyhq/saml20 to pin to >=0.9.10 | axios, lodash, and node-forge via @boxyhq/saml-jackson | ajv@6 via webpack/eslint | effect (GHSA-38f7-945m-qr2g) - awaiting @prisma/config update | fast-uri (CVE-2025-48944/48945) - awaiting ajv/schema-utils update | fast-xml-parser via AWS SDK XML builder | ip-address (XSS in Address6) - awaiting mongodb/socks update | postcss (CVE-2025-62695) - awaiting next.js to unpin postcss | protobufjs@7/8 (GHSA-xq3m-2v4x-88gg et al.) - awaiting @grpc/proto-loader/otlp-transformer update | uuid@11 (CVE-2025-61475) - awaiting typeorm update" + "overrides": "Security fixes for transitive dependencies that still fail a no-override audit. Remove each override when its upstream chain adopts a patched version: @hono/node-server/hono via Prisma dev tooling | @protobufjs/utf8 (CVE overlong UTF-8) - awaiting @opentelemetry/otlp-transformer update | @tootallnate/once and tar via sqlite3/node-gyp chain | @xmldom/xmldom (XML injection/DoS CVEs) - awaiting @boxyhq/saml20 to pin to >=0.9.10 | axios, lodash, and node-forge via @boxyhq/saml-jackson | ajv@6 via webpack/eslint | effect (GHSA-38f7-945m-qr2g) - awaiting @prisma/config update | fast-uri (CVE-2025-48944/48945) - awaiting ajv/schema-utils update | fast-xml-parser via AWS SDK XML builder | ip-address (XSS in Address6) - awaiting mongodb/socks update | minimatch@10 (CVE-2026-27904 / GHSA-23c5-xmqv-rm74, nested extglob ReDoS) - awaiting @rushstack/node-core-library (via vite-plugin-dts -> @microsoft/api-extractor) to bump to >=10.2.3 | postcss (CVE-2025-62695) - awaiting next.js to unpin postcss | protobufjs@7/8 (GHSA-xq3m-2v4x-88gg et al.) - awaiting @grpc/proto-loader/otlp-transformer update | uuid@11 (CVE-2025-61475) - awaiting typeorm update" }, "patchedDependencies": { "next-auth@4.24.13": "patches/next-auth@4.24.13.patch" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1fa4bf3995f9..12fc0ac00df0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,7 @@ overrides: hono: 4.12.18 ip-address: 10.1.1 lodash: 4.18.1 + minimatch@10: 10.2.5 node-forge: 1.4.0 postcss: 8.5.14 protobufjs@7: 7.5.8 @@ -9251,10 +9252,6 @@ packages: resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} hasBin: true - minimatch@10.2.1: - resolution: {integrity: sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==} - engines: {node: 20 || >=22} - minimatch@10.2.5: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} @@ -14554,7 +14551,7 @@ snapshots: '@rushstack/ts-command-line': 5.3.3(@types/node@25.4.0) diff: 8.0.4 lodash: 4.18.1 - minimatch: 10.2.1 + minimatch: 10.2.5 resolve: 1.22.11 semver: 7.5.4 source-map: 0.6.1 @@ -21912,10 +21909,6 @@ snapshots: mini-svg-data-uri@1.4.4: {} - minimatch@10.2.1: - dependencies: - brace-expansion: 5.0.6 - minimatch@10.2.5: dependencies: brace-expansion: 5.0.6 From b350b0934aa6226993007f7fb5e38ab0eb135efa Mon Sep 17 00:00:00 2001 From: Javi Aguilar <122741+itsjavi@users.noreply.github.com> Date: Fri, 29 May 2026 08:31:58 +0200 Subject: [PATCH 2/7] style: align main and settings nav icon styling (#8186) --- .../components/MainNavigation.tsx | 5 +++-- .../components/SettingsSidebarContent.tsx | 20 +++++-------------- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/components/MainNavigation.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/components/MainNavigation.tsx index ec4a575d5ad2..aa0817760aa9 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/components/MainNavigation.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/components/MainNavigation.tsx @@ -456,6 +456,7 @@ export const MainNavigation = ({ const switcherIconClasses = "flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-slate-100 text-slate-600"; + const mainNavIconClassName = "h-4 w-4 shrink-0"; const isInitialWorkspacesLoading = isWorkspaceDropdownOpen && !hasInitializedWorkspaces && !workspaceLoadError; @@ -546,7 +547,7 @@ export const MainNavigation = ({ disabled={item.disabled} disabledMessage={item.disabled ? disabledNavigationMessage : undefined} linkText={item.name}> - + ) )} @@ -566,7 +567,7 @@ export const MainNavigation = ({ settingsNavigationItem.disabled ? disabledNavigationMessage : undefined } linkText={settingsNavigationItem.name}> - + diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/components/SettingsSidebarContent.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/components/SettingsSidebarContent.tsx index f2a3ffe61b9b..9ee00af2d77f 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/components/SettingsSidebarContent.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/components/SettingsSidebarContent.tsx @@ -157,7 +157,6 @@ const SettingsNavLink = ({ }; const SectionHeader = ({ - icon, label, isCollapsed, isTextVisible, @@ -167,8 +166,7 @@ const SectionHeader = ({ currentId, onSwitcherChange, onSwitcherOpen, -}: { - icon: React.ReactNode; +}: Readonly<{ label: string; isCollapsed: boolean; isTextVisible: boolean; @@ -178,18 +176,17 @@ const SectionHeader = ({ currentId?: string; onSwitcherChange?: (id: string) => void; onSwitcherOpen?: () => void; -}) => { +}>) => { if (isCollapsed) { - return
{icon}
; + return null; } return (
- {icon} {label} {switcherName && switcherItems && onSwitcherChange && ( open && onSwitcherOpen?.()}> @@ -408,7 +405,6 @@ export const SettingsSidebarContent = ({
} label={t("common.workspace")} isCollapsed={isCollapsed} isTextVisible={isTextVisible} @@ -424,7 +420,6 @@ export const SettingsSidebarContent = ({
} label={t("common.organization")} isCollapsed={isCollapsed} isTextVisible={isTextVisible} @@ -439,12 +434,7 @@ export const SettingsSidebarContent = ({
- } - label={t("common.account")} - isCollapsed={isCollapsed} - isTextVisible={isTextVisible} - /> + {renderSection(accountItems)}
From 1ec74ccae8803691a52432663dee7431f5477bfe Mon Sep 17 00:00:00 2001 From: Matti Nannt Date: Fri, 29 May 2026 09:06:03 +0200 Subject: [PATCH 3/7] fix: resolve all pnpm audit vulnerabilities (#8193) Co-authored-by: Claude Opus 4.8 --- package.json | 10 +- pnpm-lock.yaml | 297 ++++++++++++++++++++++--------------------------- 2 files changed, 139 insertions(+), 168 deletions(-) diff --git a/package.json b/package.json index 455b3e20689a..6c035de0af50 100644 --- a/package.json +++ b/package.json @@ -95,17 +95,23 @@ "fast-xml-parser": "5.7.0", "hono": "4.12.18", "ip-address": "10.1.1", + "js-cookie": "3.0.7", "lodash": "4.18.1", "minimatch@10": "10.2.5", "node-forge": "1.4.0", "postcss": "8.5.14", "protobufjs@7": "7.5.8", "protobufjs@8": "8.2.0", + "qs@6": "6.15.2", "tar": "7.5.15", - "uuid@11": "11.1.1" + "uuid@8": "11.1.1", + "uuid@9": "11.1.1", + "uuid@11": "11.1.1", + "ws@8": "8.21.0", + "yaml@2": "2.9.0" }, "comments": { - "overrides": "Security fixes for transitive dependencies that still fail a no-override audit. Remove each override when its upstream chain adopts a patched version: @hono/node-server/hono via Prisma dev tooling | @protobufjs/utf8 (CVE overlong UTF-8) - awaiting @opentelemetry/otlp-transformer update | @tootallnate/once and tar via sqlite3/node-gyp chain | @xmldom/xmldom (XML injection/DoS CVEs) - awaiting @boxyhq/saml20 to pin to >=0.9.10 | axios, lodash, and node-forge via @boxyhq/saml-jackson | ajv@6 via webpack/eslint | effect (GHSA-38f7-945m-qr2g) - awaiting @prisma/config update | fast-uri (CVE-2025-48944/48945) - awaiting ajv/schema-utils update | fast-xml-parser via AWS SDK XML builder | ip-address (XSS in Address6) - awaiting mongodb/socks update | minimatch@10 (CVE-2026-27904 / GHSA-23c5-xmqv-rm74, nested extglob ReDoS) - awaiting @rushstack/node-core-library (via vite-plugin-dts -> @microsoft/api-extractor) to bump to >=10.2.3 | postcss (CVE-2025-62695) - awaiting next.js to unpin postcss | protobufjs@7/8 (GHSA-xq3m-2v4x-88gg et al.) - awaiting @grpc/proto-loader/otlp-transformer update | uuid@11 (CVE-2025-61475) - awaiting typeorm update" + "overrides": "Security fixes for transitive dependencies that still fail a no-override audit. Remove each override when its upstream chain adopts a patched version: @hono/node-server/hono via Prisma dev tooling | @protobufjs/utf8 (CVE overlong UTF-8) - awaiting @opentelemetry/otlp-transformer update | @tootallnate/once and tar via sqlite3/node-gyp chain | @xmldom/xmldom (XML injection/DoS CVEs) - awaiting @boxyhq/saml20 to pin to >=0.9.10 | axios, lodash, and node-forge via @boxyhq/saml-jackson | ajv@6 via webpack/eslint | effect (GHSA-38f7-945m-qr2g) - awaiting @prisma/config update | fast-uri (CVE-2025-48944/48945) - awaiting ajv/schema-utils update | fast-xml-parser via AWS SDK XML builder | ip-address (XSS in Address6) - awaiting mongodb/socks update | js-cookie (GHSA-qjx8-664m-686j prototype hijack) - awaiting react-use to bump to >=3.0.7 | minimatch@10 (CVE-2026-27904 / GHSA-23c5-xmqv-rm74, nested extglob ReDoS) - awaiting @rushstack/node-core-library (via vite-plugin-dts -> @microsoft/api-extractor) to bump to >=10.2.3 | postcss (CVE-2025-62695) - awaiting next.js to unpin postcss | protobufjs@7/8 (GHSA-xq3m-2v4x-88gg et al.) - awaiting @grpc/proto-loader/otlp-transformer update | qs@6 (GHSA-q8mj-m7cp-5q26 DoS) - awaiting @googleapis/admin via @boxyhq/saml-jackson update | uuid@8/9/11 (GHSA-w5hq-g745-h8pq buffer bounds, CVE-2025-61475) - awaiting @azure/msal-node, @sentry/webpack-plugin and typeorm updates | ws@8 (GHSA-58qx-3vcg-4xpx memory disclosure) - awaiting storybook and react-email/socket.io updates | yaml@2 (GHSA-48c2-rrv3-qjmp stack overflow) - awaiting lint-staged update" }, "patchedDependencies": { "next-auth@4.24.13": "patches/next-auth@4.24.13.patch" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 12fc0ac00df0..a3338c3cd10e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,14 +16,20 @@ overrides: fast-xml-parser: 5.7.0 hono: 4.12.18 ip-address: 10.1.1 + js-cookie: 3.0.7 lodash: 4.18.1 minimatch@10: 10.2.5 node-forge: 1.4.0 postcss: 8.5.14 protobufjs@7: 7.5.8 protobufjs@8: 8.2.0 + qs@6: 6.15.2 tar: 7.5.15 + uuid@8: 11.1.1 + uuid@9: 11.1.1 uuid@11: 11.1.1 + ws@8: 8.21.0 + yaml@2: 2.9.0 patchedDependencies: next-auth@4.24.13: @@ -79,7 +85,7 @@ importers: version: 10.3.6(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)) '@storybook/addon-docs': specifier: 10.3.6 - version: 10.3.6(@types/react@19.2.14)(esbuild@0.27.7)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0)) + version: 10.3.6(@types/react@19.2.14)(esbuild@0.27.7)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0)) '@storybook/addon-links': specifier: 10.3.6 version: 10.3.6(react@19.2.6)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)) @@ -88,10 +94,10 @@ importers: version: 10.3.6(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)) '@storybook/react-vite': specifier: 10.3.6 - version: 10.3.6(esbuild@0.27.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0)) + version: 10.3.6(esbuild@0.27.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0)) '@tailwindcss/vite': specifier: 4.2.4 - version: 4.2.4(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.2.4(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) '@typescript-eslint/eslint-plugin': specifier: 8.57.2 version: 8.57.2(@typescript-eslint/parser@8.57.2(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) @@ -100,7 +106,7 @@ importers: version: 8.57.2(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react': specifier: 5.1.4 - version: 5.1.4(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.1.4(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) eslint-plugin-react-refresh: specifier: 0.4.26 version: 0.4.26(eslint@8.57.1) @@ -112,7 +118,7 @@ importers: version: 10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) vite: specifier: 7.3.3 - version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) apps/web: dependencies: @@ -518,13 +524,13 @@ importers: version: 1.0.7(tailwindcss@3.4.19(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3))) vite: specifier: 7.3.3 - version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) vite-tsconfig-paths: specifier: 6.1.1 - version: 6.1.1(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 6.1.1(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 4.1.6 - version: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) vitest-mock-extended: specifier: 3.1.1 version: 3.1.1(typescript@5.9.3)(vitest@4.1.6) @@ -564,10 +570,10 @@ importers: version: 4.1.6(vitest@4.1.6) vite: specifier: 8.0.12 - version: 8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + version: 8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) vitest: specifier: 4.1.6 - version: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) packages/cache: dependencies: @@ -592,13 +598,13 @@ importers: version: 4.1.6(vitest@4.1.6) vite: specifier: 7.3.3 - version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@25.4.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.5.4(@types/node@25.4.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 4.1.6 - version: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) packages/config-eslint: devDependencies: @@ -716,10 +722,10 @@ importers: version: 4.21.0 vite: specifier: 7.3.3 - version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@25.4.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.5.4(@types/node@25.4.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) packages/email: dependencies: @@ -775,10 +781,10 @@ importers: version: 4.21.0 vite: specifier: 7.3.3 - version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) vitest: specifier: 4.1.6 - version: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) packages/jobs: dependencies: @@ -809,16 +815,16 @@ importers: version: link:../config-eslint '@vitest/coverage-v8': specifier: 4.0.18 - version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@29.1.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@29.1.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) vite: specifier: 7.3.2 - version: 7.3.2(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.2(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@25.4.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.2(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.5.4(@types/node@25.4.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.2(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 4.0.18 - version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@29.1.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@29.1.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) packages/js-core: devDependencies: @@ -833,13 +839,13 @@ importers: version: 4.1.6(vitest@4.1.6) vite: specifier: 7.3.3 - version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@25.4.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.5.4(@types/node@25.4.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 4.1.6 - version: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) packages/logger: dependencies: @@ -864,10 +870,10 @@ importers: version: link:../config-eslint vite: specifier: 7.3.3 - version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) vitest: specifier: 4.1.6 - version: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) packages/storage: dependencies: @@ -895,10 +901,10 @@ importers: version: 4.1.6(vitest@4.1.6) vite: specifier: 7.3.3 - version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) vitest: specifier: 4.1.6 - version: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) packages/survey-ui: dependencies: @@ -956,13 +962,13 @@ importers: version: 10.3.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@5.9.3) '@storybook/react-vite': specifier: 10.3.6 - version: 10.3.6(esbuild@0.27.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0)) + version: 10.3.6(esbuild@0.27.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0)) '@tailwindcss/postcss': specifier: 4.2.4 version: 4.2.4 '@tailwindcss/vite': specifier: 4.2.4 - version: 4.2.4(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.2.4(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) '@types/react': specifier: 19.2.14 version: 19.2.14 @@ -971,7 +977,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: 5.1.4 - version: 5.1.4(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 5.1.4(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/coverage-v8': specifier: 4.1.6 version: 4.1.6(vitest@4.1.6) @@ -989,16 +995,16 @@ importers: version: 4.2.4 vite: specifier: 7.3.3 - version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) vite-plugin-dts: specifier: 4.5.4 - version: 4.5.4(@types/node@25.4.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.5.4(@types/node@25.4.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) vite-tsconfig-paths: specifier: 6.1.1 - version: 6.1.1(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 6.1.1(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) vitest: specifier: 4.1.6 - version: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) packages/surveys: dependencies: @@ -1041,7 +1047,7 @@ importers: version: link:../types '@preact/preset-vite': specifier: 2.10.5 - version: 2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) '@tailwindcss/postcss': specifier: 4.2.4 version: 4.2.4 @@ -1074,10 +1080,10 @@ importers: version: 4.2.4 vite: specifier: 7.3.3 - version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) vite-tsconfig-paths: specifier: 6.1.1 - version: 6.1.1(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 6.1.1(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) packages/types: dependencies: @@ -1108,7 +1114,7 @@ importers: version: link:../config-eslint vite: specifier: 7.3.3 - version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + version: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) packages: @@ -8825,8 +8831,9 @@ packages: jpeg-js@0.4.4: resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} - js-cookie@2.2.1: - resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + js-cookie@3.0.7: + resolution: {integrity: sha512-z/wZZgDrkNV1eA0ULjM/F9/50Ya8fbzgKneSpoPsXSGd0KnpdtHfOZWK+GcwLk+EZbS4F9RBhU+K2RgzuDaItw==} + engines: {node: '>=20'} js-md4@0.3.2: resolution: {integrity: sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==} @@ -10174,8 +10181,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - qs@6.14.2: - resolution: {integrity: sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==} + qs@6.15.2: + resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==} engines: {node: '>=0.6'} quansync@0.2.11: @@ -11533,16 +11540,6 @@ packages: resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} hasBin: true - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). - hasBin: true - - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). - hasBin: true - v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -11598,7 +11595,7 @@ packages: sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 - yaml: ^2.4.2 + yaml: 2.9.0 peerDependenciesMeta: '@types/node': optional: true @@ -11638,7 +11635,7 @@ packages: sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 - yaml: ^2.4.2 + yaml: 2.9.0 peerDependenciesMeta: '@types/node': optional: true @@ -11679,7 +11676,7 @@ packages: sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 - yaml: ^2.4.2 + yaml: 2.9.0 peerDependenciesMeta: '@types/node': optional: true @@ -11917,32 +11914,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.20.1: - resolution: {integrity: sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w==} + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -12026,8 +11999,8 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} - yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} hasBin: true @@ -13305,7 +13278,7 @@ snapshots: dependencies: '@azure/msal-common': 15.13.3 jsonwebtoken: 9.0.3 - uuid: 8.3.2 + uuid: 11.1.1 '@azure/playwright@1.1.5(@playwright/test@1.58.2)': dependencies: @@ -14314,11 +14287,11 @@ snapshots: minipass: 7.1.3 optional: true - '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.7.0(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: glob: 13.0.6 react-docgen-typescript: 2.4.0(typescript@5.9.3) - vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) optionalDependencies: typescript: 5.9.3 @@ -14778,7 +14751,7 @@ snapshots: dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/core': 2.7.1(@opentelemetry/api@1.9.0) - yaml: 2.8.2 + yaml: 2.9.0 '@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0)': dependencies: @@ -15843,19 +15816,19 @@ snapshots: '@posthog/types@1.369.5': {} - '@preact/preset-vite@2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))': + '@preact/preset-vite@2.10.5(@babel/core@7.29.0)(preact@10.29.1)(rollup@4.59.0)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.29.0) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.29.0) - '@prefresh/vite': 2.4.11(preact@10.29.1)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + '@prefresh/vite': 2.4.11(preact@10.29.1)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) '@rollup/pluginutils': 5.3.0(rollup@4.59.0) babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.29.0) debug: 4.4.3 magic-string: 0.30.21 picocolors: 1.1.1 - vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) - vite-prerender-plugin: 0.5.12(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) + vite-prerender-plugin: 0.5.12(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) zimmerframe: 1.1.4 transitivePeerDependencies: - preact @@ -15872,7 +15845,7 @@ snapshots: '@prefresh/utils@1.2.1': {} - '@prefresh/vite@2.4.11(preact@10.29.1)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))': + '@prefresh/vite@2.4.11(preact@10.29.1)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@prefresh/babel-plugin': 0.5.2 @@ -15880,7 +15853,7 @@ snapshots: '@prefresh/utils': 1.2.1 '@rollup/pluginutils': 4.2.1 preact: 10.29.1 - vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -17121,7 +17094,7 @@ snapshots: '@sentry/webpack-plugin@5.1.1(encoding@0.1.13)(webpack@5.105.4(lightningcss@1.32.0)(postcss@8.5.14))': dependencies: '@sentry/bundler-plugin-core': 5.1.1(encoding@0.1.13) - uuid: 9.0.1 + uuid: 11.1.1 webpack: 5.105.4(lightningcss@1.32.0)(postcss@8.5.14) transitivePeerDependencies: - encoding @@ -17717,10 +17690,10 @@ snapshots: axe-core: 4.11.0 storybook: 10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@storybook/addon-docs@10.3.6(@types/react@19.2.14)(esbuild@0.27.7)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0))': + '@storybook/addon-docs@10.3.6(@types/react@19.2.14)(esbuild@0.27.7)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0))': dependencies: '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@19.2.6) - '@storybook/csf-plugin': 10.3.6(esbuild@0.27.7)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0)) + '@storybook/csf-plugin': 10.3.6(esbuild@0.27.7)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0)) '@storybook/icons': 2.0.1(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@storybook/react-dom-shim': 10.3.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)) react: 19.2.6 @@ -17745,25 +17718,25 @@ snapshots: dependencies: storybook: 10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@storybook/builder-vite@10.3.6(esbuild@0.27.7)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0))': + '@storybook/builder-vite@10.3.6(esbuild@0.27.7)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0))': dependencies: - '@storybook/csf-plugin': 10.3.6(esbuild@0.27.7)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0)) + '@storybook/csf-plugin': 10.3.6(esbuild@0.27.7)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0)) storybook: 10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) ts-dedent: 2.2.0 - vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - esbuild - rollup - webpack - '@storybook/csf-plugin@10.3.6(esbuild@0.27.7)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0))': + '@storybook/csf-plugin@10.3.6(esbuild@0.27.7)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0))': dependencies: storybook: 10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) unplugin: 2.3.11 optionalDependencies: esbuild: 0.27.7 rollup: 4.59.0 - vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) webpack: 5.105.4(esbuild@0.27.7)(lightningcss@1.32.0) '@storybook/global@5.0.0': {} @@ -17779,11 +17752,11 @@ snapshots: react-dom: 19.2.6(react@19.2.6) storybook: 10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@storybook/react-vite@10.3.6(esbuild@0.27.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0))': + '@storybook/react-vite@10.3.6(esbuild@0.27.7)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.7.0(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) '@rollup/pluginutils': 5.3.0(rollup@4.59.0) - '@storybook/builder-vite': 10.3.6(esbuild@0.27.7)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0)) + '@storybook/builder-vite': 10.3.6(esbuild@0.27.7)(rollup@4.59.0)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))(webpack@5.105.4(esbuild@0.27.7)(lightningcss@1.32.0)) '@storybook/react': 10.3.6(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(storybook@10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(typescript@5.9.3) empathic: 2.0.0 magic-string: 0.30.21 @@ -17793,7 +17766,7 @@ snapshots: resolve: 1.22.11 storybook: 10.3.6(@testing-library/dom@8.20.1)(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) tsconfig-paths: 4.2.0 - vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - esbuild - rollup @@ -17918,12 +17891,12 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 3.4.19(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)) - '@tailwindcss/vite@4.2.4(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))': + '@tailwindcss/vite@4.2.4(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.2.4 '@tailwindcss/oxide': 4.2.4 tailwindcss: 4.2.4 - vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) '@tanstack/query-core@5.99.2': {} @@ -18648,7 +18621,7 @@ snapshots: - supports-color - vitest - '@vitejs/plugin-react@5.1.4(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react@5.1.4(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -18656,11 +18629,11 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@29.1.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/coverage-v8@4.0.18(vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@29.1.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.18 @@ -18672,7 +18645,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@29.1.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@29.1.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) '@vitest/coverage-v8@4.1.6(vitest@4.1.6)': dependencies: @@ -18686,7 +18659,7 @@ snapshots: obug: 2.1.1 std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + vitest: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/eslint-plugin@1.6.17(@typescript-eslint/eslint-plugin@8.57.2(@typescript-eslint/parser@8.57.2(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)(vitest@4.1.6)': dependencies: @@ -18696,7 +18669,7 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 8.57.2(@typescript-eslint/parser@8.57.2(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) typescript: 5.9.3 - vitest: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + vitest: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) transitivePeerDependencies: - supports-color @@ -18726,29 +18699,29 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.0.18(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.18(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) - '@vitest/mocker@4.1.6(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.1.6(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.6 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) - '@vitest/mocker@4.1.6(vite@8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.1.6(vite@8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.6 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -20004,7 +19977,7 @@ snapshots: cors: 2.8.5 debug: 4.4.3 engine.io-parser: 5.2.3 - ws: 8.18.3 + ws: 8.21.0 transitivePeerDependencies: - bufferutil - supports-color @@ -20535,7 +20508,7 @@ snapshots: eslint: 8.57.1 optionalDependencies: '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - vitest: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + vitest: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) transitivePeerDependencies: - supports-color - typescript @@ -20993,7 +20966,7 @@ snapshots: extend: 3.0.2 gaxios: 7.1.4 google-auth-library: 10.6.1 - qs: 6.14.2 + qs: 6.15.2 url-template: 2.0.8 transitivePeerDependencies: - supports-color @@ -21024,7 +20997,7 @@ snapshots: '@types/ws': 8.18.1 entities: 7.0.1 whatwg-mimetype: 3.0.0 - ws: 8.20.1 + ws: 8.21.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -21500,7 +21473,7 @@ snapshots: jpeg-js@0.4.4: {} - js-cookie@2.2.1: {} + js-cookie@3.0.7: {} js-md4@0.3.2: {} @@ -21705,7 +21678,7 @@ snapshots: picomatch: 4.0.4 string-argv: 0.3.2 tinyexec: 1.1.2 - yaml: 2.8.2 + yaml: 2.9.0 listr2@9.0.5: dependencies: @@ -22123,7 +22096,7 @@ snapshots: preact-render-to-string: 5.2.6(preact@10.28.2) react: 19.2.6 react-dom: 19.2.6(react@19.2.6) - uuid: 8.3.2 + uuid: 11.1.1 optionalDependencies: nodemailer: 8.0.7 @@ -22631,7 +22604,7 @@ snapshots: postcss-load-config@4.0.2(postcss@8.5.14)(ts-node@10.9.2(@types/node@25.4.0)(typescript@5.9.3)): dependencies: lilconfig: 3.1.3 - yaml: 2.8.2 + yaml: 2.9.0 optionalDependencies: postcss: 8.5.14 ts-node: 10.9.2(@types/node@25.4.0)(typescript@5.9.3) @@ -22869,7 +22842,7 @@ snapshots: pngjs: 5.0.0 yargs: 15.4.1 - qs@6.14.2: + qs@6.15.2: dependencies: side-channel: 1.1.0 @@ -23093,7 +23066,7 @@ snapshots: copy-to-clipboard: 3.3.3 fast-deep-equal: 3.1.3 fast-shallow-equal: 1.0.0 - js-cookie: 2.2.1 + js-cookie: 3.0.7 nano-css: 5.6.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) react: 19.2.6 react-dom: 19.2.6(react@19.2.6) @@ -23603,7 +23576,7 @@ snapshots: socket.io-adapter@2.5.5: dependencies: debug: 4.3.7 - ws: 8.17.1 + ws: 8.21.0 transitivePeerDependencies: - bufferutil - supports-color @@ -23777,7 +23750,7 @@ snapshots: recast: 0.23.11 semver: 7.7.3 use-sync-external-store: 1.6.0(react@19.2.6) - ws: 8.20.1 + ws: 8.21.0 optionalDependencies: prettier: 3.8.3 transitivePeerDependencies: @@ -24419,10 +24392,6 @@ snapshots: uuid@14.0.0: {} - uuid@8.3.2: {} - - uuid@9.0.1: {} - v8-compile-cache-lib@3.0.1: optional: true @@ -24455,7 +24424,7 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vite-plugin-dts@4.5.4(@types/node@25.4.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.2(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-dts@4.5.4(@types/node@25.4.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.2(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)): dependencies: '@microsoft/api-extractor': 7.57.6(@types/node@25.4.0) '@rollup/pluginutils': 5.3.0(rollup@4.59.0) @@ -24468,13 +24437,13 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 7.3.2(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.2(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-plugin-dts@4.5.4(@types/node@25.4.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)): + vite-plugin-dts@4.5.4(@types/node@25.4.0)(rollup@4.59.0)(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)): dependencies: '@microsoft/api-extractor': 7.57.6(@types/node@25.4.0) '@rollup/pluginutils': 5.3.0(rollup@4.59.0) @@ -24487,13 +24456,13 @@ snapshots: magic-string: 0.30.21 typescript: 5.9.3 optionalDependencies: - vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - rollup - supports-color - vite-prerender-plugin@0.5.12(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)): + vite-prerender-plugin@0.5.12(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)): dependencies: kolorist: 1.8.0 magic-string: 0.30.21 @@ -24501,19 +24470,19 @@ snapshots: simple-code-frame: 1.3.0 source-map: 0.7.6 stack-trace: 1.0.0-pre2 - vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) - vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)): + vite-tsconfig-paths@6.1.1(typescript@5.9.3)(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) - vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color - typescript - vite@7.3.2(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.2(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0): dependencies: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.4) @@ -24528,9 +24497,9 @@ snapshots: lightningcss: 1.32.0 terser: 5.47.1 tsx: 4.21.0 - yaml: 2.8.2 + yaml: 2.9.0 - vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2): + vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0): dependencies: esbuild: 0.27.7 fdir: 6.5.0(picomatch@4.0.4) @@ -24545,9 +24514,9 @@ snapshots: lightningcss: 1.32.0 terser: 5.47.1 tsx: 4.21.0 - yaml: 2.8.2 + yaml: 2.9.0 - vite@8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2): + vite@8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -24561,18 +24530,18 @@ snapshots: jiti: 2.6.1 terser: 5.47.1 tsx: 4.21.0 - yaml: 2.8.2 + yaml: 2.9.0 vitest-mock-extended@3.1.1(typescript@5.9.3)(vitest@4.1.6): dependencies: ts-essentials: 10.1.1(typescript@5.9.3) typescript: 5.9.3 - vitest: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + vitest: 4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) - vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@29.1.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(happy-dom@20.8.9)(jiti@2.6.1)(jsdom@29.1.1(@noble/hashes@2.0.1))(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.18(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -24589,7 +24558,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -24609,10 +24578,10 @@ snapshots: - tsx - yaml - vitest@4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)): + vitest@4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.6 - '@vitest/mocker': 4.1.6(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.1.6(vite@7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.6 '@vitest/runner': 4.1.6 '@vitest/snapshot': 4.1.6 @@ -24629,7 +24598,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.3.3(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -24640,10 +24609,10 @@ snapshots: transitivePeerDependencies: - msw - vitest@4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)): + vitest@4.1.6(@opentelemetry/api@1.9.0)(@types/node@25.4.0)(@vitest/coverage-v8@4.1.6)(happy-dom@20.8.9)(jsdom@29.1.1(@noble/hashes@2.0.1))(vite@8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.6 - '@vitest/mocker': 4.1.6(vite@8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.1.6(vite@8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.6 '@vitest/runner': 4.1.6 '@vitest/snapshot': 4.1.6 @@ -24660,7 +24629,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.1.0 - vite: 8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 8.0.12(@types/node@25.4.0)(esbuild@0.27.7)(jiti@2.6.1)(terser@5.47.1)(tsx@4.21.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -24894,11 +24863,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.17.1: {} - - ws@8.18.3: {} - - ws@8.20.1: {} + ws@8.21.0: {} wsl-utils@0.1.0: dependencies: @@ -24955,7 +24920,7 @@ snapshots: yallist@5.0.0: optional: true - yaml@2.8.2: {} + yaml@2.9.0: {} yargs-parser@18.1.3: dependencies: From 4f8fe44663d238b43b3d377a850426f628c820e0 Mon Sep 17 00:00:00 2001 From: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com> Date: Fri, 29 May 2026 13:09:01 +0530 Subject: [PATCH 4/7] fix: fixes ces rating question's email embed UI (#8180) --- .../components/RatingSmiley/index.tsx | 21 +++++++--- .../components/preview-email-template.tsx | 40 +++++++++++-------- 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/apps/web/modules/analysis/components/RatingSmiley/index.tsx b/apps/web/modules/analysis/components/RatingSmiley/index.tsx index 52f1072b6f22..f9602faa71d5 100644 --- a/apps/web/modules/analysis/components/RatingSmiley/index.tsx +++ b/apps/web/modules/analysis/components/RatingSmiley/index.tsx @@ -6,6 +6,7 @@ interface RatingSmileyProps { range: number; addColors?: boolean; baseUrl?: string; + size?: number; } const getSmileyColor = (range: number, idx: number) => { @@ -31,7 +32,8 @@ const getSmiley = ( range: number, active: boolean, addColors: boolean, - baseUrl?: string + baseUrl?: string, + size: number = 24 ): JSX.Element => { const activeColor = "bg-rating-fill"; const inactiveColor = addColors ? getSmileyColor(range, idx) : "bg-fill-none"; @@ -49,6 +51,8 @@ const getSmiley = ( "grinning-squinting", ]; + const containerSize = size * 2; + const icon = ( {faceIcons[iconIdx]} ); return ( - +
{" "} {/* NOSONAR S5256 - Need table layout for email compatibility (gmail) */} @@ -83,6 +93,7 @@ export const RatingSmiley = ({ range, addColors = false, baseUrl, + size, }: RatingSmileyProps): JSX.Element => { let iconsIdx: number[] = []; if (range === 10) iconsIdx = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; @@ -92,5 +103,5 @@ export const RatingSmiley = ({ else if (range === 4) iconsIdx = [4, 5, 6, 7]; else if (range === 3) iconsIdx = [4, 5, 7]; - return getSmiley(iconsIdx[idx], idx, range, active, addColors, baseUrl); + return getSmiley(iconsIdx[idx], idx, range, active, addColors, baseUrl, size); }; diff --git a/apps/web/modules/email/components/preview-email-template.tsx b/apps/web/modules/email/components/preview-email-template.tsx index 4a3b73d9c1b3..892f6768d5e7 100644 --- a/apps/web/modules/email/components/preview-email-template.tsx +++ b/apps/web/modules/email/components/preview-email-template.tsx @@ -66,6 +66,8 @@ import { } from "../lib/preview-email-template-styles"; import { getNPSOptionColor, getRatingNumberOptionColor } from "../lib/utils"; +const EMAIL_RATING_SMILEY_SIZE = 40; + interface PreviewEmailTemplateProps { survey: TSurvey; surveyUrl: string; @@ -108,6 +110,7 @@ const getRatingContent = (scale: string, i: number, range: number, isColorCoding range={range} addColors={isColorCodingEnabled} baseUrl={WEBAPP_URL} + size={EMAIL_RATING_SMILEY_SIZE} /> ); } @@ -434,6 +437,7 @@ export async function PreviewEmailTemplate({ @@ -500,7 +504,7 @@ export async function PreviewEmailTemplate({ : undefined, height: ratingOptionHeight, isConnected: isNumberRating, - isTransparent: firstQuestion.scale === "star", + isTransparent: firstQuestion.scale === "star" || firstQuestion.scale === "smiley", optionCount: firstQuestion.range, optionIndex: i, })}> @@ -517,6 +521,7 @@ export async function PreviewEmailTemplate({ @@ -914,32 +919,35 @@ function PreviewScaleOptionColumn({ function PreviewScaleLabels({ defaultLanguageCode, lowerLabel, + optionCount, styleTokens, upperLabel, }: Readonly<{ defaultLanguageCode: string; lowerLabel: Parameters[0]; + optionCount: number; styleTokens: PreviewEmailStyleTokens; upperLabel: Parameters[0]; }>): React.JSX.Element { + const columnStyle = getScaleColumnStyle(optionCount); + const labelTextStyle = { ...getHelperLabelTextStyle(styleTokens), textAlign: "center" as const }; + return (
- - - {getLocalizedValue(lowerLabel, defaultLanguageCode)} - - - - - {getLocalizedValue(upperLabel, defaultLanguageCode)} - - + {Array.from({ length: optionCount }, (_, i) => { + const isFirst = i === 0; + const isLast = i === optionCount - 1; + return ( + + {isFirst || isLast ? ( + + {getLocalizedValue(isFirst ? lowerLabel : upperLabel, defaultLanguageCode)} + + ) : null} + + ); + })}
); From c3a089a6cacbe180be17d0364df7d48aec4c4881 Mon Sep 17 00:00:00 2001 From: Dhruwang Jariwala <67850763+Dhruwang@users.noreply.github.com> Date: Fri, 29 May 2026 14:00:25 +0530 Subject: [PATCH 5/7] =?UTF-8?q?fix:=20move=20"Create=20new=20organization"?= =?UTF-8?q?=20CTA=20to=20Organization=20=E2=86=92=20General=20(ENG-809)=20?= =?UTF-8?q?(#8171)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/MainNavigation.tsx | 38 ++++------------ .../components/WorkspaceLayout.tsx | 1 - .../components/organization-breadcrumb.tsx | 43 ++++--------------- .../components/CreateOrganizationCard.tsx | 25 +++++++++++ .../settings/organization/general/page.tsx | 22 ++++++---- 5 files changed, 56 insertions(+), 73 deletions(-) create mode 100644 apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/CreateOrganizationCard.tsx diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/components/MainNavigation.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/components/MainNavigation.tsx index aa0817760aa9..aefadba594a3 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/components/MainNavigation.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/components/MainNavigation.tsx @@ -42,7 +42,6 @@ import { getFormattedErrorMessage } from "@/lib/utils/helper"; import { useSignOut } from "@/modules/auth/hooks/use-sign-out"; import { TrialAlert } from "@/modules/ee/billing/components/trial-alert"; import { TRIAL_BASE_RESPONSE_LIMIT, TrialBannerNew } from "@/modules/ee/billing/components/trial-banner-new"; -import { CreateOrganizationModal } from "@/modules/organization/components/CreateOrganizationModal"; import { ProfileAvatar } from "@/modules/ui/components/avatars"; import { Badge } from "@/modules/ui/components/badge"; import { Button } from "@/modules/ui/components/button"; @@ -70,7 +69,6 @@ interface NavigationProps { isDevelopment: boolean; membershipRole?: TOrganizationRole; publicDomain: string; - isMultiOrgEnabled: boolean; organizationWorkspacesLimit: number; isLicenseActive: boolean; isAccessControlAllowed: boolean; @@ -86,7 +84,6 @@ export const MainNavigation = ({ isFormbricksCloud, isDevelopment, publicDomain, - isMultiOrgEnabled, organizationWorkspacesLimit, isLicenseActive, isAccessControlAllowed, @@ -232,7 +229,6 @@ export const MainNavigation = ({ const [workspaceLoadError, setWorkspaceLoadError] = useState(null); const [organizationLoadError, setOrganizationLoadError] = useState(null); const [openCreateWorkspaceModal, setOpenCreateWorkspaceModal] = useState(false); - const [openCreateOrganizationModal, setOpenCreateOrganizationModal] = useState(false); const [openWorkspaceLimitModal, setOpenWorkspaceLimitModal] = useState(false); const renderSwitcherError = (error: string, onRetry: () => void, retryLabel: string) => ( @@ -751,27 +747,17 @@ export const MainNavigation = ({ t("common.try_again") )} {!isLoadingOrganizations && !organizationLoadError && ( - <> - - {organizations.map((org) => ( - handleOrganizationChange(org.id)} - className="cursor-pointer"> - {org.name} - - ))} - - {isMultiOrgEnabled && ( + + {organizations.map((org) => ( setOpenCreateOrganizationModal(true)} - className="w-full cursor-pointer justify-between"> - {t("common.create_new_organization")} - + key={org.id} + checked={org.id === organization.id} + onClick={() => handleOrganizationChange(org.id)} + className="cursor-pointer"> + {org.name} - )} - + ))} + )} )} - {openCreateOrganizationModal && ( - - )} ); }; diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/components/WorkspaceLayout.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/components/WorkspaceLayout.tsx index 967d6826bb9e..93ef33123aa5 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/components/WorkspaceLayout.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/components/WorkspaceLayout.tsx @@ -69,7 +69,6 @@ export const WorkspaceLayout = async ({ layoutData, children }: WorkspaceLayoutP isDevelopment={IS_DEVELOPMENT} membershipRole={membership.role} publicDomain={publicDomain} - isMultiOrgEnabled={isMultiOrgEnabled} organizationWorkspacesLimit={organizationWorkspacesLimit} isLicenseActive={active} isAccessControlAllowed={isAccessControlAllowed} diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/components/organization-breadcrumb.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/components/organization-breadcrumb.tsx index da8c4d71d6fa..7f31194906e5 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/components/organization-breadcrumb.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/components/organization-breadcrumb.tsx @@ -1,21 +1,13 @@ "use client"; import * as Sentry from "@sentry/nextjs"; -import { - Building2Icon, - ChevronDownIcon, - ChevronRightIcon, - Loader2, - PlusIcon, - SettingsIcon, -} from "lucide-react"; +import { Building2Icon, ChevronDownIcon, ChevronRightIcon, Loader2, SettingsIcon } from "lucide-react"; import { useRouter } from "next/navigation"; import { useEffect, useState, useTransition } from "react"; import { useTranslation } from "react-i18next"; import { logger } from "@formbricks/logger"; import { getOrganizationsForSwitcherAction } from "@/app/(app)/workspaces/[workspaceId]/actions"; import { getFormattedErrorMessage } from "@/lib/utils/helper"; -import { CreateOrganizationModal } from "@/modules/organization/components/CreateOrganizationModal"; import { BreadcrumbItem } from "@/modules/ui/components/breadcrumb"; import { DropdownMenu, @@ -42,7 +34,6 @@ export const OrganizationBreadcrumb = ({ }: OrganizationBreadcrumbProps) => { const { t } = useTranslation(); const [isOrganizationDropdownOpen, setIsOrganizationDropdownOpen] = useState(false); - const [openCreateOrganizationModal, setOpenCreateOrganizationModal] = useState(false); const router = useRouter(); const [isPending, startTransition] = useTransition(); const [isLoadingOrganizations, setIsLoadingOrganizations] = useState(false); @@ -161,27 +152,17 @@ export const OrganizationBreadcrumb = ({ )} {!isLoadingOrganizations && !loadError && ( - <> - - {organizations.map((org) => ( - handleOrganizationChange(org.id)} - className="cursor-pointer"> - {org.name} - - ))} - - {isMultiOrgEnabled && ( + + {organizations.map((org) => ( setOpenCreateOrganizationModal(true)} + key={org.id} + checked={org.id === currentOrganizationId} + onClick={() => handleOrganizationChange(org.id)} className="cursor-pointer"> - {t("common.create_new_organization")} - + {org.name} - )} - + ))} + )} )} @@ -198,12 +179,6 @@ export const OrganizationBreadcrumb = ({ )} - {openCreateOrganizationModal && ( - - )} ); }; diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/CreateOrganizationCard.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/CreateOrganizationCard.tsx new file mode 100644 index 000000000000..3581ccf19898 --- /dev/null +++ b/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/components/CreateOrganizationCard.tsx @@ -0,0 +1,25 @@ +"use client"; + +import { useState } from "react"; +import { useTranslation } from "react-i18next"; +import { CreateOrganizationModal } from "@/modules/organization/components/CreateOrganizationModal"; +import { Alert, AlertButton, AlertDescription } from "@/modules/ui/components/alert"; + +export const CreateOrganizationCard = () => { + const { t } = useTranslation(); + const [open, setOpen] = useState(false); + + return ( +
+ + + {t("workspace.settings.general.create_new_organization_description")} + + setOpen(true)}> + {t("workspace.settings.general.create_new_organization")} + + + {open && } +
+ ); +}; diff --git a/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/page.tsx b/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/page.tsx index 9b24bdf48f60..04d7ec9f33f7 100644 --- a/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/page.tsx +++ b/apps/web/app/(app)/workspaces/[workspaceId]/settings/organization/general/page.tsx @@ -22,6 +22,7 @@ import { getWorkspaceAuth } from "@/modules/workspaces/lib/utils"; import packageJson from "@/package.json"; import { SettingsCard } from "../../components/SettingsCard"; import { AISettingsToggle } from "./components/AISettingsToggle"; +import { CreateOrganizationCard } from "./components/CreateOrganizationCard"; import { DeleteOrganization } from "./components/DeleteOrganization"; import { EditOrganizationNameForm } from "./components/EditOrganizationNameForm"; import { SecurityListTip } from "./components/SecurityListTip"; @@ -88,15 +89,18 @@ const Page = async (props: Readonly<{ params: Promise<{ workspaceId: string }> } enterpriseLicenseRequestFormUrl={ENTERPRISE_LICENSE_REQUEST_FORM_URL} /> {isMultiOrgEnabled && ( - - - + <> + + + + + )}
From 49f0dbe4e1dd9d859f57364788c13176cec1761b Mon Sep 17 00:00:00 2001 From: Tiago <1585571+xernobyl@users.noreply.github.com> Date: Fri, 29 May 2026 08:39:19 +0000 Subject: [PATCH 6/7] fix: restore Microsoft SSO account lookup (#8168) --- apps/web/modules/auth/lib/adapter.test.ts | 172 ++++++++++++++++++ apps/web/modules/auth/lib/adapter.ts | 61 +++++++ apps/web/modules/auth/lib/authOptions.ts | 4 +- .../ee/sso/lib/provider-normalization.test.ts | 10 + .../ee/sso/lib/provider-normalization.ts | 8 + 5 files changed, 253 insertions(+), 2 deletions(-) create mode 100644 apps/web/modules/auth/lib/adapter.test.ts create mode 100644 apps/web/modules/auth/lib/adapter.ts diff --git a/apps/web/modules/auth/lib/adapter.test.ts b/apps/web/modules/auth/lib/adapter.test.ts new file mode 100644 index 000000000000..99e8ddcef348 --- /dev/null +++ b/apps/web/modules/auth/lib/adapter.test.ts @@ -0,0 +1,172 @@ +import { PrismaAdapter } from "@next-auth/prisma-adapter"; +import type { PrismaClient } from "@prisma/client"; +import type { AdapterAccount } from "next-auth/adapters"; +import { createRequire } from "node:module"; +import path from "node:path"; +import { beforeEach, describe, expect, test, vi } from "vitest"; +import { logger } from "@formbricks/logger"; +import { getNextAuthAdapter } from "./adapter"; + +type TCallbackHandler = (params: unknown) => Promise; + +const mocks = vi.hoisted(() => ({ + getUserByAccount: vi.fn(), + getUserByEmail: vi.fn(), + linkAccount: vi.fn(), + unlinkAccount: vi.fn(), + createUser: vi.fn(), + createSession: vi.fn(), +})); + +vi.mock("@formbricks/logger", () => ({ + logger: { + error: vi.fn(), + warn: vi.fn(), + info: vi.fn(), + debug: vi.fn(), + }, +})); + +vi.mock("@next-auth/prisma-adapter", () => ({ + PrismaAdapter: vi.fn(), +})); + +const requireNextAuthModule = createRequire(import.meta.url); +const nextAuthPackageRoot = path.dirname(requireNextAuthModule.resolve("next-auth")); +const callbackHandler = requireNextAuthModule(path.join(nextAuthPackageRoot, "core/lib/callback-handler.js")) + .default as TCallbackHandler; + +const baseAdapter = { + getUserByAccount: mocks.getUserByAccount, + getUserByEmail: mocks.getUserByEmail, + linkAccount: mocks.linkAccount, + unlinkAccount: mocks.unlinkAccount, + createUser: mocks.createUser, + createSession: mocks.createSession, +}; + +const prismaClient = {} as PrismaClient; + +const azureAccount: AdapterAccount = { + userId: "user_1", + type: "oauth", + provider: "azure-ad", + providerAccountId: "sub-123", +}; + +describe("getNextAuthAdapter", () => { + beforeEach(() => { + vi.clearAllMocks(); + vi.mocked(PrismaAdapter).mockReturnValue(baseAdapter as never); + }); + + test("normalizes the Microsoft provider id to the canonical value when resolving a user", async () => { + const user = { id: "user_1", email: "user@example.com" }; + mocks.getUserByAccount.mockResolvedValue(user); + + const adapter = getNextAuthAdapter(prismaClient); + const result = await adapter.getUserByAccount?.({ + provider: "azure-ad", + providerAccountId: "sub-123", + }); + + expect(mocks.getUserByAccount).toHaveBeenCalledWith({ + provider: "azuread", + providerAccountId: "sub-123", + }); + expect(result).toBe(user); + }); + + test("passes already-canonical providers through unchanged", async () => { + mocks.getUserByAccount.mockResolvedValue(null); + + const adapter = getNextAuthAdapter(prismaClient); + await adapter.getUserByAccount?.({ provider: "google", providerAccountId: "g-1" }); + + expect(mocks.getUserByAccount).toHaveBeenCalledWith({ + provider: "google", + providerAccountId: "g-1", + }); + }); + + test("normalizes the provider when linking and unlinking accounts", async () => { + const adapter = getNextAuthAdapter(prismaClient); + + await adapter.linkAccount?.(azureAccount); + await adapter.unlinkAccount?.({ provider: "azure-ad", providerAccountId: "sub-123" }); + + expect(mocks.linkAccount).toHaveBeenCalledWith( + expect.objectContaining({ provider: "azuread", providerAccountId: "sub-123", userId: "user_1" }) + ); + expect(mocks.unlinkAccount).toHaveBeenCalledWith({ + provider: "azuread", + providerAccountId: "sub-123", + }); + }); + + test("lets the NextAuth OAuth callback resolve canonical Microsoft account rows", async () => { + const user = { id: "user_1", email: "user@example.com" }; + const session = { + sessionToken: "session-token", + userId: user.id, + expires: new Date("2026-01-01T00:00:00.000Z"), + }; + + mocks.getUserByAccount.mockImplementation(async ({ provider }) => (provider === "azuread" ? user : null)); + mocks.getUserByEmail.mockResolvedValue(user); + mocks.createSession.mockResolvedValue(session); + + const result = await callbackHandler({ + sessionToken: undefined, + profile: { id: "profile_1", email: user.email }, + account: azureAccount, + options: { + adapter: getNextAuthAdapter(prismaClient), + events: {}, + jwt: {}, + provider: { id: "azure-ad" }, + session: { + strategy: "database", + generateSessionToken: () => "session-token", + maxAge: 60 * 60, + }, + }, + }); + + expect(result).toEqual({ + session, + user, + isNewUser: false, + }); + expect(mocks.getUserByAccount).toHaveBeenCalledWith({ + provider: "azuread", + providerAccountId: "sub-123", + }); + expect(mocks.getUserByEmail).not.toHaveBeenCalled(); + expect(mocks.linkAccount).not.toHaveBeenCalled(); + }); + + test("logs and rethrows when a delegated adapter method fails", async () => { + const failure = new Error("database unavailable"); + mocks.getUserByAccount.mockRejectedValue(failure); + + const adapter = getNextAuthAdapter(prismaClient); + + await expect( + adapter.getUserByAccount?.({ provider: "azure-ad", providerAccountId: "sub-123" }) + ).rejects.toThrow(failure); + expect(logger.error).toHaveBeenCalledWith(failure, 'NextAuth Prisma adapter "getUserByAccount" failed'); + }); + + test("preserves base adapter methods that do not key on the provider", () => { + const adapter = getNextAuthAdapter(prismaClient); + expect(adapter.createUser).toBe(mocks.createUser); + }); + + test("throws when the base adapter is missing required account methods", () => { + vi.mocked(PrismaAdapter).mockReturnValueOnce({} as never); + expect(() => getNextAuthAdapter(prismaClient)).toThrow( + "PrismaAdapter is missing the account methods required for SSO sign-in" + ); + }); +}); diff --git a/apps/web/modules/auth/lib/adapter.ts b/apps/web/modules/auth/lib/adapter.ts new file mode 100644 index 000000000000..cd93f2ce5b0c --- /dev/null +++ b/apps/web/modules/auth/lib/adapter.ts @@ -0,0 +1,61 @@ +import { PrismaAdapter } from "@next-auth/prisma-adapter"; +import type { PrismaClient } from "@prisma/client"; +import type { Awaitable } from "next-auth"; +import type { Adapter, AdapterAccount } from "next-auth/adapters"; +import { logger } from "@formbricks/logger"; +import { resolveAccountProvider } from "@/modules/ee/sso/lib/provider-normalization"; + +type TProviderAccountKey = Pick; + +const normalizeProviderKey = (value: T): T => ({ + ...value, + provider: resolveAccountProvider(value.provider), +}); + +/** + * Wraps an adapter method so any failure is logged with context before being re-thrown. + * NextAuth turns the re-thrown error into the relevant auth error page, so we keep the + * original behaviour while making adapter-level failures observable. + */ +const withAdapterErrorLogging = + (method: string, handler: (...args: TArgs) => Awaitable) => + async (...args: TArgs): Promise => { + try { + return await handler(...args); + } catch (error) { + logger.error(error, `NextAuth Prisma adapter "${method}" failed`); + throw error; + } + }; + +/** + * NextAuth resolves accounts by each provider's NextAuth `id` — Microsoft's is "azure-ad" — but + * Formbricks persists the canonical `IdentityProvider` value ("azuread") in `Account.provider`. + * Left unreconciled, the adapter's native lookup misses the stored row, falls back to matching by + * email, and rejects the sign-in with `OAuthAccountNotLinked`. + * + * Normalizing the provider at the adapter boundary keeps the native lookup/link/unlink aligned with + * both the stored rows and the custom SSO sign-in handler for every provider, without leaking + * provider-specific naming into the call sites. + */ +export const getNextAuthAdapter = (prismaClient: PrismaClient): Adapter => { + const baseAdapter = PrismaAdapter(prismaClient); + const { getUserByAccount, linkAccount, unlinkAccount } = baseAdapter; + + if (!getUserByAccount || !linkAccount || !unlinkAccount) { + throw new Error("PrismaAdapter is missing the account methods required for SSO sign-in"); + } + + return { + ...baseAdapter, + getUserByAccount: withAdapterErrorLogging("getUserByAccount", (providerAccount: TProviderAccountKey) => + getUserByAccount(normalizeProviderKey(providerAccount)) + ), + linkAccount: withAdapterErrorLogging("linkAccount", (account: AdapterAccount) => + linkAccount(normalizeProviderKey(account)) + ), + unlinkAccount: withAdapterErrorLogging("unlinkAccount", (providerAccount: TProviderAccountKey) => + unlinkAccount(normalizeProviderKey(providerAccount)) + ), + }; +}; diff --git a/apps/web/modules/auth/lib/authOptions.ts b/apps/web/modules/auth/lib/authOptions.ts index e99d340a854e..7cf9fdef657c 100644 --- a/apps/web/modules/auth/lib/authOptions.ts +++ b/apps/web/modules/auth/lib/authOptions.ts @@ -1,4 +1,3 @@ -import { PrismaAdapter } from "@next-auth/prisma-adapter"; import type { NextAuthOptions } from "next-auth"; import CredentialsProvider from "next-auth/providers/credentials"; import { cookies } from "next/headers"; @@ -37,6 +36,7 @@ import { import { UNKNOWN_DATA } from "@/modules/ee/audit-logs/types/audit-log"; import { getSSOProviders } from "@/modules/ee/sso/lib/providers"; import { handleSsoCallback } from "@/modules/ee/sso/lib/sso-handlers"; +import { getNextAuthAdapter } from "./adapter"; import { createBrevoCustomer } from "./brevo"; type TSignInCallbackParams = Parameters["signIn"]>>[0]; @@ -137,7 +137,7 @@ const handleEnterpriseSsoSignIn = async ({ }; export const authOptions: NextAuthOptions = { - adapter: PrismaAdapter(prisma), + adapter: getNextAuthAdapter(prisma), providers: [ CredentialsProvider({ id: "credentials", diff --git a/apps/web/modules/ee/sso/lib/provider-normalization.test.ts b/apps/web/modules/ee/sso/lib/provider-normalization.test.ts index d91456b1086a..f256e524152e 100644 --- a/apps/web/modules/ee/sso/lib/provider-normalization.test.ts +++ b/apps/web/modules/ee/sso/lib/provider-normalization.test.ts @@ -3,6 +3,7 @@ import { getLegacySsoProviderAliases, getSsoProviderLookupCandidates, normalizeSsoProvider, + resolveAccountProvider, } from "./provider-normalization"; describe("SSO provider normalization", () => { @@ -25,4 +26,13 @@ describe("SSO provider normalization", () => { expect(getSsoProviderLookupCandidates("azuread")).toEqual(["azuread", "azure-ad"]); expect(getSsoProviderLookupCandidates("google")).toEqual(["google"]); }); + + test("resolves NextAuth provider ids to the canonical Account.provider string", () => { + expect(resolveAccountProvider("azure-ad")).toBe("azuread"); + expect(resolveAccountProvider("google")).toBe("google"); + }); + + test("passes unknown providers through unchanged", () => { + expect(resolveAccountProvider("credentials")).toBe("credentials"); + }); }); diff --git a/apps/web/modules/ee/sso/lib/provider-normalization.ts b/apps/web/modules/ee/sso/lib/provider-normalization.ts index 377e5e0cba25..24a15ad7f119 100644 --- a/apps/web/modules/ee/sso/lib/provider-normalization.ts +++ b/apps/web/modules/ee/sso/lib/provider-normalization.ts @@ -37,3 +37,11 @@ export const getSsoProviderLookupCandidates = (provider: string): string[] => { return [normalizedProvider, ...getLegacySsoProviderAliases(normalizedProvider)]; }; + +/** + * Resolves a NextAuth provider id (e.g. "azure-ad") to the canonical provider string persisted + * in `Account.provider` (e.g. "azuread"). Unknown providers are returned unchanged so callers + * never drop a value they were handed. + */ +export const resolveAccountProvider = (provider: string): string => + normalizeSsoProvider(provider) ?? provider; From 6a7f56188be8195d6a1e7e9264b8cf970e6a7f8c Mon Sep 17 00:00:00 2001 From: Anshuman Pandey <54475686+pandeymangg@users.noreply.github.com> Date: Fri, 29 May 2026 14:28:35 +0530 Subject: [PATCH 7/7] fix: S3 internal server error for older images (#8195) --- packages/storage/src/service.test.ts | 49 ++++++++++++++++++++++++++++ packages/storage/src/service.ts | 4 ++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/packages/storage/src/service.test.ts b/packages/storage/src/service.test.ts index 9cc8c83a9ebd..c4e3f04f3da6 100644 --- a/packages/storage/src/service.test.ts +++ b/packages/storage/src/service.test.ts @@ -565,6 +565,55 @@ describe("service.ts", () => { } }); + test("returns file not found when S3 reports NotFound", async () => { + vi.doMock("./constants", () => mockConstants); + + const notFoundError = new Error("not found"); + notFoundError.name = "NotFound"; + const mockS3Client = { + send: vi.fn().mockRejectedValueOnce(notFoundError), + }; + + vi.doMock("./client", () => ({ + createS3Client: vi.fn(() => mockS3Client), + })); + + const { getFileStream } = await import("./service"); + + const result = await getFileStream("responses/missing.pdf"); + + expect(result.ok).toBe(false); + + if (!result.ok) { + expect(result.error.code).toBe("file_not_found_error"); + } + }); + + test("returns file not found when S3 error carries a 404 status code", async () => { + vi.doMock("./constants", () => mockConstants); + + const s3Error = Object.assign(new Error("not found"), { + $metadata: { httpStatusCode: 404 }, + }); + const mockS3Client = { + send: vi.fn().mockRejectedValueOnce(s3Error), + }; + + vi.doMock("./client", () => ({ + createS3Client: vi.fn(() => mockS3Client), + })); + + const { getFileStream } = await import("./service"); + + const result = await getFileStream("responses/missing.pdf"); + + expect(result.ok).toBe(false); + + if (!result.ok) { + expect(result.error.code).toBe("file_not_found_error"); + } + }); + test("logs and returns unknown when streaming fails unexpectedly", async () => { vi.doMock("./constants", () => mockConstants); diff --git a/packages/storage/src/service.ts b/packages/storage/src/service.ts index 03138dc04688..575903683d4c 100644 --- a/packages/storage/src/service.ts +++ b/packages/storage/src/service.ts @@ -191,7 +191,9 @@ export const getFileStream = async (fileKey: string): Promise